我试图在Erlang shell中编写一个递归有趣的代码,但我总是得到一个未绑定的变量异常:
1> Foo = fun(X) -> Foo(X) end.
* 1: variable 'Foo' is unbound这可能是不言而喻的,但我并不是要创建一个无限循环!这只是我得到的错误的一个简单示例。
发布于 2009-05-15 08:12:31
自OTP 17.0以来,有命名的funs:
1> Perms = fun F([]) -> [[]]; F(L) -> [[H|T] || H <- L, T <- F(L--[H])] end.
#Fun<erl_eval.30.54118792>
2> Perms([a,b,c]).
[[a,b,c],[a,c,b],[b,a,c],[b,c,a],[c,a,b],[c,b,a]]在此之前,您可以使用一个小参数技巧来完成此操作:
1> Foo = fun(F, X) -> F(F, X) end.
#Fun<erl_eval.12.113037538>
2> Foo(Foo, a).
<...infinite loop!>这里的诀窍是将函数作为参数发送给自身,以允许递归。
另一种方法是在一次拍摄中完成:
1> Foo = fun(X) -> Fun = fun(F,Y) -> F(F,Y) end, Fun(Fun,X) end.
#Fun<erl_eval.6.13229925>
2> Foo(a).例如:
1> Foo = fun(Max) ->
1> Fun = fun(F, X) when X > Max -> [];
1> (F, X) -> [X | F(F, X+1)]
1> end,
1> Fun(Fun, 0)
1> end.
#Fun<erl_eval.6.13229925>
2> Foo(10).
[0,1,2,3,4,5,6,7,8,9,10]发布于 2014-05-02 16:14:03
在Erlang 17之后,您还可以使用"Funs with names"变体:
Foo = fun F(X) -> F(X) end.这样就更容易理解F是定义中的函数本身。此外,Foo和F可以是同一个变量。
发布于 2009-05-15 12:47:47
或者,您可以使用Y组合器。Y Combinator in Erlang解释道。
https://stackoverflow.com/questions/867418
复制相似问题