Erlang:如何实现Erlang列表理解?

时间:2012-06-21 21:04:36

标签: erlang list-comprehension

实现一个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]]

但似乎我应该能够将其作为列表理解来实现。我的二郎福太弱了,无法想出来。

有什么建议吗?

由于

2 个答案:

答案 0 :(得分:8)

不,列表理解不是一个好方法,根据定义,它们一次只能处理一个元素。在您的代码中,实际上不需要使用累加器,速度差异很小,here,没有它就会变得更清晰。我至少这么认为。

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

答案 1 :(得分: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].

这个时间的复杂性可能很糟糕,因为据我所知,Erlang并没有以任何方式优化它。

我认为你的功能没有任何问题,你应该坚持下去。