结合两种不同的功能定义-一种咖喱,一种标准

克里斯·斯洛维克(Chris Slowik)

一直在快速处理咖喱函数,现在我正在尝试编写一个可以写成以下形式的函数:

sum(1,2) //or
sum(1)(2) //both equal 3

使用两个函数定义很容易做到这一点:

// curried - usage: sum(1)(2) or sum(1)
func sum(a: Int) -> (Int -> Int) {
    return { b in a + b }
}

// regular - usage: sum(1,2)
func sum(a: Int, _ b: Int) -> Int {
    return a + b
}

我一直试图将它们组合成一个可以用任何一种方式调用的函数,但是我认为我要么陷入困境,要么没有解决方案。我尝试使用泛型类型对其进行重新处理,但仍然遇到参数数量的问题,即使使用可选参数也是如此。

那么,关于如何将它们结合起来的任何想法,还是不可能迅速实现?

格里姆森

我不知道您为什么要尝试执行此操作,因此我可能完全错过了要点,但这是我能找到的最接近的内容...

enum IntOrFunction {
    case Number(Int)
    case Function((Int -> Int))
    var function: (Int -> Int) {
        switch self {
        case .Function(let f):
            return f
        case .Number(let i):
            return { _ in return i }
        }
    }
}

func sum(params: Int...) -> IntOrFunction {
    if params.count == 1 {
        let a = params[0]
        return .Function({ b in a + b })
    } else {
        return .Number(params.reduce(0, combine: {$0 + $1}))
    }
}

let a = sum(1,2) // "Number(3)"
let b = sum(1) // "Function((Function))"
let c = b.function(3) // "4"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

一种字体,两种文本,不同字符

一种用于两种不同签名的方法

tidyr中的gather(),两种不同的代码,一种是正确的,一种是错误的

两种文本视图,一种在左侧,另一种在右侧

如何连接两种形式(一种是另一种形式的数组)

两种形式-一种提交按钮?

两种形式,一种提交按钮

两种模型的一种关系

Requestjs 有两种不同的语法:一种作为数组,一种作为对象

使用CSS填充背景-两种不同的颜色,一种与另一种颜色重叠

MVC一种类型,一页-两种不同的DisplayFor

使用Java标准密钥库是一种不好的做法

在C#中将值从两种不同的形式传递到一种主要形式

使两种结构与一种方法的实现不同

具有不同资源的两种口味从一种基本口味继承布局

如何以一种形式使用两种不同的动作方法?

提交一种表单后发送两种不同的电子邮件

Dagger2 如何@Provide 一种具有两种不同实现的类型

显示两种不同的文本以获得一种权限

如何设计一种可以处理两种不同对象类型的方法

如何用一种方法指向两种不同的方法?

一种模型不可访问,一种模型

Android:为一种EditText使用两种自定义字体

一种倒猫

一种排序算法

一种推拉窗

使一种类型成为一种或另一种

Rails:从一种模型到另一种模型的两种关系(别名)

具有相同内核版本的两种编译:一种引导,一种无法找到根设备