使用匿名函数进行函数式编程

匿名函数可用于函数编程。要解决的主要问题是没有本地方法来锚定递归,但这仍然可以在一行中实现:

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}));