2009-11-22 6 views
1

Fun을 사용하여 한 줄에이 절을 표시하는 방법.절을 Fun으로 변환

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

두 개의 절이있는 하나의 함수입니다. – Christian

답변

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 코드를 사용할 수 있습니다.

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"] 
관련 문제