Swift subtiler Unterschied zwischen Curry und Funktion höherer Ordnung

HINWEIS: Diese Frage wurde gestellt, während Swift 2.1 die neueste war.

Gegeben

class IntWrapper {
    var i: Int = 1
}
func add(inout m: Int, i: Int) {
    m += i
}

Und eine Funktion höherer Ordnung

func apply() -> (inout i: Int) -> () -> () {
    return { (inout i: Int) -> () -> () in
        return {
            add(&i, i: 1)
        }
    }
}

Application as so führt dazu, dass sich der Wert der Mitgliedsvariablen niemals ändert:

var intW = IntWrapper()
print(intW.i)                             // Prints '1'
apply()(i: &intW.i)()
print(intW.i)                             // Prints '1'

Allerdings, wenn die Funktion auf Curry-Form geändert wird

func apply()(inout i: Int)() -> () {
    add(&i, i: 1)
}

Anwendung führt dazu, dass sich der Wert der Mitgliedsvariablen ändert:

var intW = IntWrapper()
print(intW.i)                             // Prints '1'
apply()(i: &intW.i)()
print(intW.i)                             // Prints '2'

Ich bin gespannt warum das so ist. Ich habe immer gedacht, dass Curry-Syntax Zucker für die übergeordnete Form der Funktion ist, aber anscheinend gibt es semantische Unterschiede.

Zusätzlichdieser angenommene Vorschlag Curry-Syntax von swift zu entfernen scheint zu sagen, dass dies nur Zucker ist, und ich befürchte, wir verlieren mehr als Syntax, indem wir dies aus der Sprache entfernen. Gibt es eine Möglichkeit, die gleiche Funktionalität von einer Funktion höherer Ordnung zu erhalten?

Antworten auf die Frage(0)

Ihre Antwort auf die Frage