карри в схеме - PullRequest
       31

карри в схеме

6 голосов
/ 27 июня 2011

У меня есть эта curry функция:

(define curry
(lambda (f) (lambda (a) (lambda (b) (f a b)))))

Я думаю, что это похоже на (define curry (f a b)).

, мое назначение - написать функцию consElem2All с использованием curry ,, котораядолжно работать как

(((consElem2All cons) 'b) '((1) (2 3) (4)))
>((b 1) (b 2 3) (b 4))

Я написал эту функцию регулярно:

(define (consElem2All0 x lst) 
  (map (lambda (elem) (cons x elem)) lst))

, но все еще не знаю, как преобразовать ее с помощью curry.Кто-нибудь может мне помочь?

спасибо заранее

bearzk

Ответы [ 3 ]

4 голосов
/ 14 июля 2011

Вы должны начать с чтения о карри.Если вы не понимаете, что такое карри, это может быть очень трудно использовать ... В вашем случае, http://www.engr.uconn.edu/~jeffm/Papers/curry.html может быть хорошим началом.

Одно очень распространенное и интересное использованиекаррирования с такими функциями, как уменьшение или отображение (для себя или своих аргументов).

Давайте определим два оператора карри!

(define curry2 (lambda (f) (lambda (arg1) (lambda (arg2) (f arg1 arg2)))))
(define curry3 (lambda (f) (lambda (arg1) (lambda (arg2) (lambda (arg3) (f arg1 arg2 arg3))))))

Затем несколько математических функций карри:

(define mult (curry2 *))
(define double (mult 2))

(define add (curry2 +))
(define increment (add 1))
(define decrement (add -1))

И затем идет карри, уменьшите / отобразите:

(define creduce (curry3 reduce))
(define cmap (curry2 map))

Используя их

Сначала уменьшите варианты использования:

(define sum ((creduce +) 0))
(sum '(1 2 3 4)) ; => 10

(define product (creduce * 1))
(product '(1 2 3 4)) ; => 24

А затем сопоставьте варианты использования:

(define doubles (cmap double))
(doubles '(1 2 3 4)) ; => (2 4 6 8)

(define bump (cmap increment))
(bump '(1 2 3 4)) ; => (2 3 4 5)

Надеюсь, это поможет вам понять полезность карри ...

1 голос
/ 27 июня 2011

Итак, ваша версия карри принимает функцию с двумя аргументами, скажем:

(define (cons a b) ...)

и превращает это в нечто, что вы можете назвать так:

(define my-cons (curry cons))
((my-cons 'a) '(b c)) ; => (cons 'a '(b c)) => '(a b c)

У вас действительно естьфункция, которая принимает три аргумента.Если у вас был curry3, который управлял 3-мя функциями, вы могли бы сделать что-то вроде:

(define (consElem2All0 the-conser x lst) ...)

(как вы сделали, но позволяя использовать функции, похожие на минусы, отличные от минусов!)

и затем сделайте это:

(define consElem2All (curry3 consElem2All0))

У вас нет такого curry3 под рукой.Таким образом, вы можете либо создать его, либо обойти его, «вручную» каррируя дополнительную переменную самостоятельно.Работа вокруг выглядит примерно так:

(define (consElem2All0 the-conser)
  (lambda (x lst) ...something using the-conser...))
(define (consElem2All the-conser)
  (curry (consElem2All0 the-conser)))

Обратите внимание, что есть еще одно возможное использование карри в самом выражении карты, подразумеваемое тем, что вы оборачиваете лямбду вокруг cons, чтобы передать элемент в cons.Как вы могли бы вставить x в cons, чтобы получить функцию с одним аргументом, которую можно использовать непосредственно для отображения? ...

0 голосов
/ 29 июня 2011
(define (consElem2All0 x lst) 
  (map ((curry cons) x) lst))
...