Он каррируется - вам не нужно передавать все аргументы сразу, но он генерирует список, когда все они "прибыли".
Обычно записывают все параметры карри слевасторона, если функция не предназначена для того, чтобы быть в первую очередь «функцией создания функции».
Определение больше похоже на тип, если вы напишите его в (эквивалентной) форме
fun zipWith f = fn xs =>
fn ys =>
case (xs,ys) of
([],_) => []
| (_,[]) => []
| (x::xs',y::ys') => (f(x,y)) :: ((zipWith f) xs') ys'
Пример "curriedness":
- val add = zipWith (op +);
val add = fn : int list -> int list -> int list
- val add_123 = add [1,2,3];
val add_123 = fn : int list -> int list
- add_123 [4,5,6];
val it = [5,7,9] : int list