Как написать простую функцию высшего порядка в mozart oz?

Я новичок в mozart oz, и я хотел бы написать простую функцию более высокого порядка, например {{Add 1}2}, результатом которой должно быть 3. Я думаю, это что-то вроде вложенного вызова в C, где функция может вызывать себя? Я не уверен, как определить эту функцию, должен ли я написать

declare
fun {Add I}

or

declare
fun {{Add I}J}

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


person phil    schedule 14.01.2013    source источник


Ответы (2)


Что-то вроде этого должно работать (не проверено):

declare
   fun {Add I}
      % define a local function which adds I to its argument
      fun {Adder J}
         J + I
      end
   in
      % returns this new function
      Adder
   end

{Show {{Add 1} 2}}  % should print 3

% or more verbose:
declare
   Add1 = {Add 1}
   {Show {Add1 2}}
person wmeyer    schedule 14.01.2013
comment
Я получаю, что Variable Adder не был введен. - person Tadgh; 14.09.2013
comment
@Tadgh: Действительно, произошла ошибка. Я добавил ключевое слово in, чтобы отделить объявление локального сумматора от тела функции. - person wmeyer; 14.09.2013
comment
Спасибо. Почему именно это работает? Функция объявляется только локально, и тогда возвращаемое значение всей функции равно Adder? - person Tadgh; 14.09.2013
comment
@Tadgh: Да, возвращаемое значение Add — это функция Adder (т. е. функции — это значения). Не проблема, что Adder объявляется только локально. Функция (и код, стоящий за ней) — это просто значение, как и любое другое значение, и оно будет уничтожено/собрано мусором только тогда, когда никакая переменная больше не ссылается на него. - На самом деле, Adder должен определяться локально, потому что он замыкается на параметр I. Новая функция Adder создается всякий раз, когда вызывается Add. - person wmeyer; 14.09.2013

краткий код:

fun{Add I}
   fun{$ J} I+J end
end
person yakoudbz    schedule 01.04.2014