将子句转换为Fun

时间:2009-11-22 04:01:35

标签: erlang

如何使用Fun在一行中表示此子句。

perms([]) -> [[]];
perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].

2 个答案:

答案 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"]