如何使用Fun在一行中表示此子句。
perms([]) -> [[]];
perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].
答案 0 :(得分:7)
我相信你所寻求的是一种“自我递归”的乐趣。
有趣的语法无法在有趣的体内引用自身,因此需要使用一种技巧,其中调用的乐趣是参数。这通常被称为ycombinator。
一些示例代码可能会更好地描述它:
permutator() ->
fun
([], _F) ->
[[]];
(L, F) ->
[ [H|T] || H <- L, T <- F(L--[H], F)]
end.
do_permutate(L) ->
P = permutator(),
P(L, P).
你可以看到这很尴尬。如果您只是想参考您的perms函数,可以使用代码:fun perms/1
。
答案 1 :(得分:3)
我还得到了另一个与克里斯蒂安相似的答案。
5> Perms = fun(X) -> Fun = fun([],F) -> [[]]; (L,F) -> [[H|T] || H <- L, T <- F(L--[H],F)] end, Fun(X, Fun) end.
#Fun<erl_eval.6.13229925>
6> Perms("cat").
["cat","cta","act","atc","tca","tac"]