fn (x:'a) => fn (y:'b) => f (x,y)
анализируется как fn (x:'a) => (fn (y:'b) => f (x,y))
. Таким образом, у вас есть функция, которая принимает аргумент x типа a и возвращает другую функцию, которая принимает аргумент y типа b. Затем эта другая функция возвращает результат вызова f (x,y)
.
fun foo x y = ...
- синтаксический сахар для val foo = fn x => fn y => ...
, поэтому снова foo
- это функция, которая принимает один аргумент x и возвращает другую функцию, которая принимает один аргумент y.
Аналогично, вызов foo 1 2
будет проанализирован как (foo 1) 2
, то есть он вызывает функцию foo
с аргументом 1, а затем вызывает результирующую функцию с аргументом 2.