看来主流语言都支持函数字面量 http://en.wikipedia.org/wiki/First-class_function这些日子。他们也被称为匿名函数 http://en.wikipedia.org/wiki/Anonymous_function,但我不在乎他们是否有名字。重要的是函数字面量是一个表达式,它产生一个尚未在其他地方定义的函数,例如在 C 中,&printf
不算。
编辑添加:如果您有真正的函数文字表达式<exp>
,你应该能够将它传递给一个函数f(<exp>)
或立即将其应用于论证,即。<exp>(5)
.
我很好奇哪些语言可以让你编写函数文字递归的。维基百科的“匿名递归 http://en.wikipedia.org/wiki/Anonymous_recursion” 文章没有给出任何编程示例。
我们以递归阶乘函数为例。
以下是我所知道的:
-
JavaScript / ECMAScript 可以做到这一点callee
:
function(n){if (n<2) {return 1;} else {return n * arguments.callee(n-1);}}
-
用以下语言很容易letrec
,例如 Haskell(它称之为let
):
let fac x = if x<2 then 1 else fac (x-1) * x in fac
Lisp 和Scheme 中也有类似的东西。请注意,绑定fac
是表达式的局部函数,因此整个表达式实际上是一个匿名函数。
还有其他人吗?
大多数语言通过使用来支持它Y组合器 http://en.wikipedia.org/wiki/Fixed_point_combinator#Y_combinator。这是一个 Python 示例(来自cookbook http://code.activestate.com/recipes/576366/):
# Define Y combinator...come on Gudio, put it in functools!
Y = lambda g: (lambda f: g(lambda arg: f(f)(arg))) (lambda f: g(lambda arg: f(f)(arg)))
# Define anonymous recursive factorial function
fac = Y(lambda f: lambda n: (1 if n<2 else n*f(n-1)))
assert fac(7) == 5040
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)