注意:当Swift 2.1是最新的时,问了这个问题。
假设:
class IntWrapper {
var i: Int = 1
}
func add(inout m: Int, i: Int) {
m += i
}
更高阶函数
func apply() -> (inout i: Int) -> () -> () {
return { (inout i: Int) -> () -> () in
return {
add(&i, i: 1)
}
}
}
因此,应用程序导致成员变量值永远不会改变:
var intW = IntWrapper()
print(intW.i) // Prints '1'
apply()(i: &intW.i)()
print(intW.i) // Prints '1'
但是,将功能更改为curry form
func apply()(inout i: Int)() -> () {
add(&i, i: 1)
}
应用程序导致成员变量值更改:
var intW = IntWrapper()
print(intW.i) // Prints '1'
apply()(i: &intW.i)()
print(intW.i) // Prints '2'
我很好奇为什么会这样。我一直认为curried语法对于函数的高阶形式来说是糖,但显然存在语义差异。
另外this accepted proposal从swift中移除curried语法似乎表明这仅仅是糖,我担心我们通过从语言中删除它而失去的语法不仅仅是语法。有没有办法从更高阶的函数中获得相同的功能?