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

List Erlang中不正确列表的实际使用(可能是所有函数式语言),list,functional-programming,erlang,List,Functional Programming,Erlang,我一直在阅读Erlang和OTP的《行动》,偶然发现了一个关于不当列表的问题 不要试图使用列表单元格 即使你认为你有一个 聪明的想法-它容易出现bug并且 混淆了人和程序 分析工具。也就是说,有 创建的一个或两个有效用途 不正确的列表,但它们被认为是 高级编程技术和 超出了本书的范围 超出了这本书的范围?它必须是完美的堆栈溢出 所以我的问题是,当然,一些有效的用法是什么?一个有效的用法被描述在最底部,在关于惰性生成器的部分中。这个代码示例应该创建一个很长的列表,一次只使用一个元素,因此它不是一次

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

不要试图使用列表单元格 即使你认为你有一个 聪明的想法-它容易出现bug并且 混淆了人和程序 分析工具。也就是说,有 创建的一个或两个有效用途 不正确的列表,但它们被认为是 高级编程技术和 超出了本书的范围

超出了这本书的范围?它必须是完美的堆栈溢出

所以我的问题是,当然,一些有效的用法是什么?

一个有效的用法被描述在最底部,在关于惰性生成器的部分中。这个代码示例应该创建一个很长的列表,一次只使用一个元素,因此它不是一次生成整个列表,而是创建一个不正确的列表,其尾部描述了如何生成列表的其余部分:

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

换句话说,它是一个惰性列表,Erlang本身并没有提供给您。

Erlang文档建议的一个用途是:


OTP stdlib字典实现dict模块正在使用不正确的键值对列表。 对正是2元组使用的内存比2元素列表多1个字。看见
有关详细信息,请参见有向图的OTP标准模块对标记的顶点和边标识符使用了不正确的列表。例如,顶点42将被标识为['$v'| 42],这意味着一对原子(不,不是字符文字!)和一个整数,类似地,边97将被标识为['$e'| 97]

以防万一,由于类型系统的原因,您不能在Haskell中构造不正确的列表。这毫无意义。
数据列表不当a=Nil | Cons a(列表不当a)|不当a
:)我在读同一本书,问了同样的问题。这是一个私人玩笑,只有那些看代码的人才会注意到。节省的成本非常小,而且是在宏中定义的,因此,如果有人真的受到影响,很容易进行更改。:-)嗯,尽管源代码证实了这一点,但在R13B04和R14B01中,对于我来说,
dict:append(apa,hest,dict:new())
产生:
{dict,1,16,16,8,80,48,{…},{{[[apa,hest]],…}}
这听起来像是一个连续的分数。
-module(lazy).
-export([ints_from/1]).
ints_from(N) ->
    fun() ->
            [N|ints_from(N+1)]
    end.