Каррированная функция на самом деле не является функцией, которая принимает функцию и производит другую функцию. Это функция более высокого порядка.
Каррированная функция — это просто функция, которая принимает более одного аргумента и может быть частично применена, передав ей только один из своих аргументов.
Например, с вашим вопросом о сигме,
fun sigma (f,m,n) = ...
не является каррированной функцией, так как принимает только один аргумент (кортеж (f,m,n)
.)
fun sigma f m n = ...
, однако, это каррированная функция, так как она принимает три аргумента, и допустимо сказать что-то вроде
val sigmasquare = sigma (fn x => x * x)
, частично применив сигму, передав ей первый аргумент.
Более простым примером будет
fun add (x,y) = x + y
Это некаррированная функция. Чтобы оценить его, вы должны указать его аргумент, который включает в себя как x
, так и y
. add (3,5)
в этом случае будет равно 8.
fun add x y = x + y
является каррированной версией этой же функции. Это можно частично оценить, просто присвоив ему x
. Например, add 3
будет оцениваться как функция, которая добавит три к своему аргументу.
Это более ясно видно, если посмотреть на предыдущие примеры как на анонимные или лямбда-функции.
Первый эквивалентен fn (x,y) => x + y
, который явно принимает два целых числа и оценивается как целое число.
Второй эквивалентен fn x => fn y => x + y
, который принимает целое число и возвращает функцию, принимающую другое целое число и возвращающую целое число.
Таким образом, тип первого — (int * int) -> int
, а тип второго — int -> int -> int
.
Надеюсь, это немного прояснит карри.
person
qaphla
schedule
24.09.2013