Как называется этот функциональный «шаблон»? - PullRequest
6 голосов
/ 14 января 2009

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

function WhatAmIDoing(args...)
   return function()
       return args
   end
end

Редактировать: Обобщая функцию, она принимает переменное количество аргументов (или, возможно, неявный список) и возвращает функцию, которая при вызове возвращает все аргументы, что-то вроде карри или рассола, но это тоже не похоже.

Ответы [ 7 ]

11 голосов
/ 14 января 2009

WhatAmIDoing - это функция высшего порядка , потому что это функция, которая возвращает другую функцию.

Он возвращает thunk & mdash; замыкание, созданное для отложенного вычисления фактического значения. Обычно thunks создаются для ленивой оценки выражения (и, возможно, для его запоминания), но в других случаях вместо простого значения требуется просто функция, как в случае «constantly 5», который в некоторых языках возвращает функция, которая всегда возвращает 5.

Последнее может применяться в приведенном примере, поскольку, предполагая, что язык оценивается в аппликативном порядке (т. Е. Оценивает аргументы перед вызовом функции), функция не служит никакой другой цели, кроме как превращать значения в функцию, которая их возвращает. 1010 *

WhatAmIDoing действительно является реализацией "постоянно" функции, которую я описывал. Но в общем случае вам не нужно возвращать только args во внутренней функции. Вы можете вернуть "ackermann(args)", что может занять много времени, как в ...

function WhatAmIDoing2(args...)
   return function()
       return ackermann(args)
   end
end

Но WhatAmIDoing2 немедленно вернется, потому что оценка функции ackermann будет приостановлена ​​в замыкании . (Да, даже на языке вызовов по значению.)

5 голосов
/ 14 января 2009

В функциональном программировании функция, которая принимает другую функцию в качестве аргумента или возвращает другую функцию, называется функцией более высокого порядка .

4 голосов
/ 14 января 2009

Я бы сказал, что XXXX возвращает замыкание безымянной функции, связанной со значениями x, y и z.

Эта статья в Википедии может пролить свет

2 голосов
/ 14 января 2009

Curry - это преобразование функции в цепочку функций, каждая из которых принимает только один параметр и возвращает другую такую ​​функцию. Таким образом, этот пример не имеет отношения к карри.

Пиклинг - это термин, обычно используемый для обозначения некоторой сериализации. Возможно для хранения объекта, созданного из нескольких значений.

Если интересующий вас аспект заключается в том, что возвращаемая функция может получить доступ к аргументам функции XXXX, то я бы остановился на Remo.D

1 голос
/ 12 мая 2010

Нечто очень похожее называется constantly в Clojure:

http://github.com/richhickey/clojure/blob/ab6fc90d56bfb3b969ed84058e1b3a4b30faa400/src/clj/clojure/core.clj#L1096

Только функция, которую возвращает constantly, принимает произвольное количество аргументов, что делает ее более общей (и гибкой), чем ваш шаблон.

Я не знаю, имеет ли этот шаблон имя, но использовал бы его в тех случаях, когда обычно ожидаются функции, но все, что меня волнует, - это возвращение определенного значения:

(map (constantly 9) [1 2 3])
=> (9 9 9) 

Просто интересно, для чего ты это используешь?

1 голос
/ 14 января 2009

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

0 голосов
/ 14 января 2009

делегат?

В основном вы возвращаете функцию ?? или вывод функции?

Не понял, извините ...

...