在Erlang中实际使用不正确的列表(可能是所有函数式语言)

时间:2011-02-23 08:35:14

标签: list functional-programming erlang

我一直在阅读 Erlang和OTP的行动,并偶然发现了一个关于不当列表的问题。

  

不要试图使用列表单元格   这种方式即使你认为你有一个   聪明的主意 - 它很容易出错   混淆了人类和程序   分析工具。那说,有   创建的一两个有效用途   不恰当的名单,但他们被考虑   高级编程技术和   超出了本书的范围。

超出了本书的范围?它必须是Stackoverflow的完美! 所以我的问题当然是,一些有效的用途是什么?

4 个答案:

答案 0 :(得分:6)

Erlang文档建议的一个用途是faking lazy lists

-module(lazy).
-export([ints_from/1]).
ints_from(N) ->
    fun() ->
            [N|ints_from(N+1)]
    end.

答案 1 :(得分:4)

Eunit user manual的最底部,关于延迟生成器的部分中描述了一个有效的用法。这个代码示例应该创建一个非常长的列表,一次只消耗一个元素,所以不是一次生成整个列表而是创建一个不正确的列表,其尾部描述了如何生成列表的其余部分:

lazy_test_() ->
    lazy_gen(10000).
lazy_gen(N) ->
    {generator,
     fun () ->
         if N > 0 ->
                [?_test(...)
                 | lazy_gen(N-1)];
            true ->
                []
         end
     end}.

换句话说,它是一个懒惰的列表,Erlang本身并没有给你。

答案 2 :(得分:4)

OTP stdlib字典实现dict模块正在使用键值对的不正确列表。 理由是2元组使用比2元素不正确列表多1个字的内存。看到 efficiency guide了解详情

答案 3 :(得分:0)

有向图的OTP标准digraph模块使用标记顶点和边标识符的不正确列表。例如,顶点42将被标识为[' $ v' | 42],这意味着一对原子(不,不是字符文字!)和整数,类似边缘97将是[& #39; $ E' | 97]。