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

Tje*_*lle 8 erlang functional-programming list

我一直在阅读Erlang和OTP,并偶然发现了一个关于不正确列表的问题.

即使您认为自己有一个聪明的想法,也不要试图以这种方式使用列表单元格 - 它容易出错并且会混淆人类和程序分析工具.也就是说,创建不正确的列表有一两个有效用途,但它们被认为是高级编程技术,超出了本书的范围.

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

Ale*_*nov 6

Erlang文档建议的一个用法是伪造懒惰列表:

-module(lazy).
-export([ints_from/1]).
ints_from(N) ->
    fun() ->
            [N|ints_from(N+1)]
    end.
Run Code Online (Sandbox Code Playgroud)


leg*_*cia 5

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

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

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