我一直在阅读 Erlang和OTP的行动,并偶然发现了一个关于不当列表的问题。
不要试图使用列表单元格 这种方式即使你认为你有一个 聪明的主意 - 它很容易出错 混淆了人类和程序 分析工具。那说,有 创建的一两个有效用途 不恰当的名单,但他们被考虑 高级编程技术和 超出了本书的范围。
超出了本书的范围?它必须是Stackoverflow的完美! 所以我的问题当然是,一些有效的用途是什么?
答案 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]。