Swift curried函数和高阶函数之间的细微差别

Swift curried函数和高阶函数之间的细微差别,swift,higher-order-functions,currying,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 {

注:此问题是在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'
var intW = IntWrapper()
print(intW.i)                             // Prints '1'
apply()(i: &intW.i)()
print(intW.i)                             // Prints '2'
但是,将函数更改为咖喱形式时

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 '1'
var intW = IntWrapper()
print(intW.i)                             // Prints '1'
apply()(i: &intW.i)()
print(intW.i)                             // Prints '2'
我很好奇为什么会这样。我一直认为咖喱语法对于函数的高阶形式来说是一种糖分,但显然存在语义上的差异

此外,从swift中删除咖喱语法似乎表明这仅仅是糖,我担心,从语言中删除咖喱语法会损失更多。有没有办法从高阶函数中获得相同的功能


我在:apply()(I:&intW.I,w:IntWrapper())处收到一个错误“调用中的额外参数w”。为什么在使用curried语法时会有这个额外的参数?。如果我删除它,手动和curry语法版本的结果是相同的。编辑-我忘记了删除它,而清理我的原始源代码为这个简单的例子。我刚刚在操场上又试了一次,我可以向你保证结果是一样的。我将查看是否可以添加屏幕截图。我添加了一些照片。我在:apply()(I:&intW.I,w:IntWrapper())处收到错误“调用中的额外参数w”。为什么在使用curried语法时会有这个额外的参数?。如果我删除它,手动和curry语法版本的结果是相同的。编辑-我忘记了删除它,而清理我的原始源代码为这个简单的例子。我刚刚在操场上又试了一次,我可以向你保证结果是一样的。我看看能不能加个截图。我加了一些照片。