@yul12

Декаррирование / Uncurrying: как работает на лямбда исчислении?

Доброго времени дня!

Может ли добрая душа помочь разобраться в обратном процессе каррирования ? Каррирование хорошо объяснено на примерах в разных языках, а вот о декаррировании только информация, что это транформация противоположная каррированию. Как декаррировать на примере чистого лямбда исчисления?

Благодарю заранее за отклики!
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Функциональное программирование
Седой и строгий
Если на примере чистого лямбда-исчисления, то
define Head = λg . g (λa . λb . a)
define Tail = λg . g (λa . λb . b)
define Uncurry = λf . λp . f (head p) (tail p)

Вы уверены, что оно вам именно в таком виде надо, если вы саму концепцию не понимаете?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@polak228
Декаррирование, также известное как "разкаррирование" или "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`.

Декаррирование может быть полезным, когда нужно преобразовать функцию с несколькими аргументами в функцию, которая может быть передана в качестве аргумента другой функции или использована в качестве значения по умолчанию.
Ответ написан
@AlexSku
Программист по автоматике
Примеры на Haskell.
Возьмём функцию min, которая ждёт двух аргументов, а приходит кортеж (пара). Вот uncurry позволяет функции обрабатывать кортеж:
min 1 2        -- результат 1
uncurry f (x,y) = f x y
-- применение
uncurry min (1,2)   -- результат 1

Если определение записать в виде лямбда, то:
uncurry = \ f (x,y) -> f x y
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы