Декаррирование, также известное как "разкаррирование" или "uncurrying", - это процесс, который преобразует функцию, принимающую несколько аргументов, в функцию, которая принимает только один аргумент и возвращает новую функцию, которая принимает оставшиеся аргументы. Например, функция `f(x, y)` может быть декаррирована в функцию `g(x)`, которая в свою очередь возвращает функцию `h(y)`.
В чистом лямбда-исчислении функция может быть декаррирована с помощью конструкции `(lambda (x) (lambda (y) (f x y)))`, где `f` - это функция с двумя аргументами. Например, функция `(lambda (x) (+ x 1))` может быть декаррирована следующим образом:
(define (decurry f)
(lambda (x) (lambda (y) (f x y))))
((decurry (lambda (x y) (+ x y))) 1 2)
;; Вернет 3
В этом примере функция `decurry` принимает функцию `f` с двумя аргументами и возвращает функцию, которая принимает один аргумент `x` и возвращает функцию, которая принимает один аргумент `y`. При вызове `((decurry (lambda (x y) (+ x y))) 1 2)` сначала вызывается функция `decurry`, которая возвращает функцию `(lambda (y) (+ 1 y))`, а затем эта функция вызывается с аргументом `2`, возвращая результат `3`.
Декаррирование может быть полезным, когда нужно преобразовать функцию с несколькими аргументами в функцию, которая может быть передана в качестве аргумента другой функции или использована в качестве значения по умолчанию.