Карринг - это преобразование, которое можно применять к функциям, чтобы они могли принимать на один аргумент меньше, чем ранее.
Например, в F # вы можете определить функцию следующим образом: -
let f x y z = x + y + z
Здесь функция f принимает параметры x, y и z и суммирует их вместе так: -
f 1 2 3
Возвращает 6.
Исходя из нашего определения, мы можем определить функцию карри для f: -
let curry f = fun x -> f x
Где 'fun x -> f x' - лямбда-функция, эквивалентная x => f (x) в C #. Эта функция вводит функцию, которую вы хотите каррировать, и возвращает функцию, которая принимает один аргумент и возвращает указанную функцию с первым аргументом, установленным для входного аргумента.
Используя наш предыдущий пример, мы можем получить карри f таким образом: -
let curryf = curry f
Затем мы можем сделать следующее: -
let f1 = curryf 1
, которая предоставляет нам функцию f1, которая эквивалентна f1 y z = 1 + y + z. Это означает, что мы можем сделать следующее: -
f1 2 3
, который возвращает 6.
Этот процесс часто путают с «частичным применением функции», которое можно определить следующим образом: -
let papply f x = f x
Хотя мы можем расширить его до нескольких параметров, т. Е .:-
let papply2 f x y = f x y
let papply3 f x y z = f x y z
etc.
Частичное приложение будет принимать функцию и параметр (ы) и возвращать функцию, которая требует одного или нескольких меньших параметров, и, как показывают предыдущие два примера, реализована непосредственно в стандартном определении функции F #, чтобы мы могли достичь предыдущего результата Таким образом: -
let f1 = f 1
f1 2 3
Который вернет результат 6.
В заключение: -
Разница между карри и частичным применением функции заключается в том, что: -
Curry берет функцию и предоставляет новую функцию, принимающую один аргумент и возвращающую указанную функцию с первым аргументом, установленным для этого аргумента. Это позволяет нам представлять функции с несколькими параметрами в виде серии функций с одним аргументом . Пример: -
let f x y z = x + y + z
let curryf = curry f
let f1 = curryf 1
let f2 = curryf 2
f1 2 3
6
f2 1 3
6
Приложение с частичной функцией более прямое: оно принимает функцию и один или несколько аргументов и возвращает функцию с первыми n аргументами, для которых задано n аргументов. Пример: -
let f x y z = x + y + z
let f1 = f 1
let f2 = f 2
f1 2 3
6
f2 1 3
6