使用匿名函数进行函数式编程
匿名函数可用于函数编程。要解决的主要问题是没有本地方法来锚定递归,但这仍然可以在一行中实现:
if_ = @(bool, tf) tf{2-bool}();
此函数接受布尔值和两个函数的单元数组。如果布尔值的计算结果为 true,则评估第一个函数;如果布尔值的计算结果为 false,则计算第二个函数。我们现在可以轻松编写阶乘函数:
fac = @(n,f) if_(n>1, {@()n*f(n-1,f), @()1});
这里的问题是我们不能直接调用递归调用,因为在评估右侧时函数尚未分配给变量。但是,我们可以通过写作完成这一步骤
factorial_ = @(n)fac(n,fac);
现在,@(n)fac(n,fac)
递归地评估阶乘函数。使用 y-combinator 进行函数式编程的另一种方法,也可以很容易地实现:
y_ = @(f)@(n)f(n,f);
使用此工具,阶乘功能甚至更短:
factorial_ = y_(fac);
或直接:
factorial_ = y_(@(n,f) if_(n>1, {@()n*f(n-1,f), @()1}));