Diferença sutil rápida entre função de ordem com curry e de ordem superior
NOTA: Esta pergunta foi feita enquanto o Swift 2.1 era o mais recente.
Dado:
class IntWrapper {
var i: Int = 1
}
func add(inout m: Int, i: Int) {
m += i
}
E uma função de ordem superior
func apply() -> (inout i: Int) -> () -> () {
return { (inout i: Int) -> () -> () in
return {
add(&i, i: 1)
}
}
}
A aplicação assim resulta no valor da variável do membro nunca mudando:
var intW = IntWrapper()
print(intW.i) // Prints '1'
apply()(i: &intW.i)()
print(intW.i) // Prints '1'
No entanto, ao alterar a função para o formato ao curry
func apply()(inout i: Int)() -> () {
add(&i, i: 1)
}
O aplicativo resulta na alteração do valor da variável do membro:
var intW = IntWrapper()
print(intW.i) // Prints '1'
apply()(i: &intW.i)()
print(intW.i) // Prints '2'
Estou curioso para saber por que isso acontece. Eu sempre pensei que a sintaxe ao curry fosse açúcar para a forma mais alta da função, mas aparentemente existem diferenças semânticas.
Além dissoesta proposta aceita remover a sintaxe ao curry do swift parece indicar que isso é apenas açúcar, e estou preocupado que estamos perdendo mais do que sintaxe removendo isso do idioma. Existe uma maneira de obter a mesma funcionalidade de uma função de ordem superior?