Нужна помощь в понимании карри - PullRequest
2 голосов
/ 30 июля 2011

Вот пример, который я взял из этой книги (http://www.cs.cornell.edu/riccardo/prog-smlnj/notes-011001.pdf)

-fun curry (f:'a * 'b -> 'c) = fn (x:'a) => fn (y:'b) => f (x,y);
val curry = fn : ('a * 'b -> 'c) -> 'a -> 'b -> 'c

Как мне интерпретировать эту функцию. Карри принимает в качестве аргумента функцию f типа 'a *' b -> 'c. Iне могу понять часть после '='. Каков порядок ассоциативности?

Вот еще один пример:

fun add’ (x:int) (y:int):int = x + y;

Как это анализируется?

Википедия говорит«каррирование - это метод преобразования функции, которая принимает несколько аргументов (или n-кортеж аргументов) таким образом, что ее можно назвать цепочкой функций, каждая из которых имеет один аргумент (частичное применение)».один аргумент: первый или последний из нескольких аргументов?

1 Ответ

2 голосов
/ 30 июля 2011

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.

...