【发布时间】:2012-12-28 07:48:49
【问题描述】:
我是 mozart oz 的初学者,我想写一个简单的高阶函数,例如 {{Add 1}2},其结果必须为 3。我想这类似于嵌套调用C,函数可以在哪里调用自己?我不知道如何定义这个函数,我应该写吗
declare
fun {Add I}
或
declare
fun {{Add I}J}
? 而且我真的不知道如何完成这样的功能。试了好几次都没成功。
【问题讨论】:
我是 mozart oz 的初学者,我想写一个简单的高阶函数,例如 {{Add 1}2},其结果必须为 3。我想这类似于嵌套调用C,函数可以在哪里调用自己?我不知道如何定义这个函数,我应该写吗
declare
fun {Add I}
或
declare
fun {{Add I}J}
? 而且我真的不知道如何完成这样的功能。试了好几次都没成功。
【问题讨论】:
这样的东西应该可以工作(未经测试):
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}}
【讨论】:
Add 的返回值是函数Adder(即函数是值)。 Adder 仅在本地声明不是问题。该函数(及其背后的代码)只是一个值,就像任何其他值一样,只有在没有变量引用它时才会被销毁/垃圾收集。 - 事实上,Adder必须在本地定义,因为它“关闭”了参数I。每当调用 Add 时,都会创建一个新函数 Adder。
简洁的代码:
fun{Add I}
fun{$ J} I+J end
end
【讨论】: