Быстрая тонкая разница между функцией карри и высшего порядка

ПРИМЕЧАНИЕ: этот вопрос был задан, когда 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'

Однако при изменении функции на карри

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'

Мне интересно, почему это так. Я всегда думал, что карри синтаксис был сахаром для более высокого порядка формы функции, но, очевидно, есть семантические различия.

Дополнительноэто принятое предложение кажется, что удаление карри синтаксиса из swift означает, что это просто сахар, и я обеспокоен тем, что мы теряем больше, чем синтаксис, удаляя это из языка. Есть ли способ получить такую ​​же функциональность от функции более высокого порядка?

Ответы на вопрос(0)

Ваш ответ на вопрос