2009-11-22 132 views
1

如何使用乐趣在一行中表示此子句。将子句转换为乐趣

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

这是一个带有两个子句的函数。 – Christian 2009-11-22 07:22:50

回答

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). 

正如你可以看到这是很尴尬的。如果你只是想参考你的烫发功能,你可以使用代码:fun perms/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"]