2012-06-21 3 views
6

목록에서 두 요소를 취하여 목록의 새 목록을 만드는 Erlang 목록 이해를 구현하십시오.얼랭 (Erlang) : 얼랭 목록 이해력을 구현하는 방법은 무엇입니까?

는이 코드 잘 작동

pair([], Acc) -> lists:reverse(Acc); 

pair(L, Acc0) -> 
    [ A, B | T ] = L, 
    Acc = [ [A, B] | Acc0 ], 
    pair(T, Acc). 

있습니다

7> l:pair(lists:seq(1,6), []). 
[[1,2],[3,4],[5,6]] 

을하지만 지능형리스트로이를 구현 할 수 있어야한다처럼 보인다. Erlang-fu는 너무 약해서 해결할 수 없습니다.

제안 사항?

감사

답변

1

이 불가피 에 대한 목록의 모든 요소를 무언가를해야하기 때문에 목록의 이해가 못생긴 것입니다. 목록 이해력을 만들기 위해서는 당신이 말하고있는 짝수이거나 이상한 요소인지 알아봐야합니다. 여기에 내가 무슨 말인지의 아이디어입니다 : 지금까지 내가 알고 있어요으로 얼랑 어떤 식 으로든이 최적화되지 않기 때문에

pair(L) -> 
    L2 = lists:zip(lists:seq(1, length(L)), L), 
    [[A, B] || {Ai, A} <- L2, {Bi, B} <- L2, 
      Ai rem 2 == 1, Bi rem 2 == 0, Ai + 1 == Bi]. 

이 하나의 시간 복잡도는 아마도 끔찍한입니다.

나는 당신의 기능에 문제가 있다고 생각하지 않으며 그것에 충실해야한다.

8

아니요, 목록의 이해는 그럴 수있는 좋은 방법이 아닙니다. 정의에 따르면 목록 작성은 한 번에 하나의 요소에서만 작동합니다. 코드에서 누산기를 사용할 필요가 없으며 속도 차이는 작습니다 (here). 나는 적어도 그렇게 생각한다.

pairs([A,B|L]) -> 
    [[A,B]|pairs(L)]; 
pairs([]) -> []. 
+1

다음은 Erlang mantra "let it crash"다음과 같습니다. '[a]'의 경우. – Tilman

+0

@Tilman 예, 함수는 ** 쌍으로 된 요소를 취하여 목록에 홀수 개의 요소가있는 경우 오류 인 경우 ** 정의 **됩니다. 물론 그 경우에 일어날 일을 정의하고 그 후에 처리 할 수 ​​있습니다. – rvirding