Closure, лямбда, карринг
От: Programmierer AG  
Дата: 15.09.06 12:24
Оценка: 144 (7) +3
#Имя: FAQ.fp.terminology
Beam wrote:
> P.S. Вообще-то я хотел поговорить именно о терминологии, т.е.получить/найти определения — лямбда, замыкание, карринг. Т.е. объяснение не на примерах, а именно определение терминов.

В таком случае проще прочесть в Википедии.

Из-за того, что в
лямбда-исчислении, функции прекрасно обходятся без имен, конструкции языков программирования, позволяющие в контексте выражения определить безымянную функцию/процедуру, часто называют лямбда-функциями, чаще всего неправомерно, просто по аналогии с Лиспом, в котором такая конструкция появилась впервые.

Карринг — простое преобразование, позволяющее свести все функции к функциям одного аргумента. Если язык программирования поддерживает функции высшего порядка, такое преобразование всегда можно выполнить вручную (Scheme):

(define foo_curried
    (lambda (x)
        (lambda (y)
            (foo x y)))))

Языки, о которых говорят, что они поддерживают карринг, это преобразование делают автоматически, т.е. (Ocaml)

let foo x y z = expr
(* эквивалентно *)
let foo =fun x -> fun y -> fun z -> expr


Closure

Это тело функции + окружение, в котором определены значения всех свободных переменных.
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.