【问题标题】:Erlang : how to implement Erlang list comprehension ?Erlang:如何实现 Erlang 列表理解?
【发布时间】:2012-06-24 04:39:27
【问题描述】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这遵循 Erlang 的口头禅“让它崩溃”,例如对于案例[a]
    • @Tilman 是的,该函数被定义以获取元素对,因此如果列表中有奇数个元素,则会出错。当然,您总是可以定义在这种情况下会发生什么,然后再处理它。
    【解决方案2】:

    列表推导式会很笨拙,因为它不可避免地必须为列表中的每个元素做一些事情。因此,要创建列表理解,您必须尝试找出您正在与之交谈的元素是偶数还是奇数。这是我在说什么的一个想法:

    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 不会以任何方式优化它。

    我不认为你的功能有什么问题,你应该坚持下去。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      相关资源
      最近更新 更多