我正在阅读编程Erlang,当我将它们输入到erlang REPL:


 perms([]) - > [[]];
烫发(L) - > [[H | T] || H< -L,T< - perms(L - [H])]。
 * 1:语法错误:' - >'

& #xA;
 我知道我无法在shell中以这种方式定义函数,因此我将其更改为:


 2> Perms = fun([]) - > [[]];(L) - > [[H | T] || H< -L,T< - Perms(L - [H])] end。
 * 1:变量'Perms'未绑定


 
 这是否意味着我无法在shell中定义递归函数?

答案 0 :(得分:5)
由于OTP 17.0有名为funs:
- Funs现在可以命名为
README
中的更多详细信息:
OTP-11537 Funs can now be a given a name. Thanks to to Richard O'Keefe for the idea (EEP37) and to Anthony Ramine for the implementation.
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> Perms = fun(List) ->
G = fun(_, []) -> [[]];
(F, L) -> [[H|T] || H <- L, T <- F(F, L--[H])]
end,
G(G, List)
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]]