【发布时间】:2014-11-16 23:49:15
【问题描述】:
我正在尝试实现函数组合。一开始我定义了一个名为compose的函数。
func compose<A,B,C>(f:(B -> C))(g: (A -> B)) -> A -> C {
return { f(g($0)) }
}
这很好用。例如,如果我有 not 和 isEven 之类的函数
func not(value: Bool) -> Bool {
return !value
}
func even(value: Int) -> Bool {
return value % 2 == 0
}
odd 函数可以用not 和even 来定义,如下所示:
func odd(value: Int) -> Bool {
return compose(not)(isEven)(value)
}
然后我决定使用自定义运算符而不是 compose 函数。自定义运算符为..。起初我只是复制了compose 函数并将其名称更改为..。下面是它的样子:
infix operator .. { associativity left }
func ..<A,B,C>(f:(B -> C))(g: (A -> B)) -> A -> C {
return { f(g($0)) }
}
这里 Xcode 给出错误:“一元运算符实现必须有 'prefix' 或 'postfix' 修饰符”
之后我把操作符改成这样:
infix operator .. { associativity left }
func ..<A,B,C>(f: (B -> C), g: (A -> B)) -> A -> C {
return { f(g($0)) }
}
而odd 作用于:
func odd(value: Int) -> Bool {
return (not..even)(value)
}
或者作为闭包:
let odd = not..even
这段代码有效。现在我知道在这里使.. 运算符柯里化可能没有任何好处,但我想知道为什么不允许柯里化运算符?例如,如果+ 操作符被定义为柯里化函数,我们会做这样的事情:
let array = [1,2,3,4]
array.map((+1))
【问题讨论】:
标签: swift operator-overloading currying