咖喱和高阶函数之间的快速细微差别

时间:2016-02-16 03:56:09

标签: swift higher-order-functions currying

注意:当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语法似乎表明这仅仅是糖,我担心我们通过从语言中删除它而失去的语法不仅仅是语法。有没有办法从更高阶的函数中获得相同的功能?

Higher Order Function Currying

0 个答案:

没有答案