LINUX.ORG.RU

scheme define


0

0

Начал изучать схему и не могу понять чем отличается
(define (square x) (* x x))
от
(define square (lambda (x) (* x x))
т.е. зачем вообще используется второй случай, если функцию можно точно так же определить напрямую через define?

anonymous

Ответ на: комментарий от tche

Ясно. Тогда ещё вопрос: (define (curried-add x) (lambda (y) (+ x y)) ((curried-add 3) 7) ; 10 это функция с двумя параметрами (x - это внешняя переменная для (lambda (y)) )? x - это 3, а y - 7. Но зачем так делать?

anonymous
()
Ответ на: комментарий от tche

Ясно.
Тогда ещё вопрос:
(define (curried-add x) (lambda (y) (+ x y))
((curried-add 3) 7) ; 10
это функция с двумя параметрами (x - это внешняя переменная для (lambda (y)) )? x - это 3, а y - 7. Но зачем так делать?

anonymous
()
Ответ на: комментарий от anonymous

`curried-add` имеет один аргумент, но и возвращает функцию одного аргумента. С его помощью, например, откладывается вычисление (т. е. выполняется частичное применение ФМП).

Таким образом показывается, что ФМП не нужны. В лямбда-исчислении все функции от одного аргумента и в каждом определении только одна связанная переменная:

λx.λy.y x

и т. д.

Sphinx ★★☆☆
()
Ответ на: комментарий от anonymous

Это реализация карринга ( http://en.wikipedia.org/wiki/Currying ) на Схеме (на самом деле, можно покрасивей, если использовать макры).

Представить, например, что ты хочешь преобразовать список, добавив 5 к каждому из содержащихся в нём чисел.

Обычно это делается так: (map (lambda (x) (+ x 5)) '(1 2 3))

Если же использовать curried-add, будет проще: (map (curried-add 5) '(1 2 3))

Подобная концепция изначально реализована на уровне языка, например в Haskell -- там подобные вещи выглядят более натурально: map (5 +) [1; 2; 3]

tche
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.