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

发布于 2024-10-19 04:35:22 字数 282 浏览 0 评论 0原文

我一直在阅读《Erlang 和 OTP 的实际应用》,并偶然发现了一个有关不正确列表的问题。

不要试图使用列表单元格 这样即使你认为你有 聪明的主意——它很容易出现错误并且 让人类和程序都感到困惑 分析工具。也就是说,有 一种或两种有效的创建用途 不正确的列表,但它们被认为 先进的编程技术和 超出了本书的范围。

超出了本书的范围?它一定非常适合 Stackoverflow!
所以我的问题当然是,一些有效的用途是什么?

I've been reading Erlang and OTP in action, and stumbled upon a question with regards to improper lists.

Don’t be tempted to use list cells
this way even if you think you have a
clever idea — it’s bug-prone and
confuses both humans and program
analysis tools. That said, there are
one or two valid uses for creating
improper lists, but they’re considered
advanced programming techniques and
are beyond the scope of this book.

Out of scope for the book? It must be perfect for Stackoverflow!
So my question is, of course, what would some valid uses would be?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

诺曦 2024-10-26 04:35:22

Erlang 文档建议的一种用途是伪造惰性列表

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

One use suggested by Erlang documentation is faking lazy lists:

-module(lazy).
-export([ints_from/1]).
ints_from(N) ->
    fun() ->
            [N|ints_from(N+1)]
    end.
夜司空 2024-10-26 04:35:22

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

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

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

One valid use is described at the very bottom of the Eunit user manual, in the section about lazy generators. This code example is supposed to create a very long list that will be consumed one element at a time, so instead of generating the entire list at once it creates an improper list whose tail describes how to generate the rest of the list:

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

In other words, it's a lazy list, which Erlang itself doesn't give you.

娇俏 2024-10-26 04:35:22

OTP stdlib 字典实现 dict 模块对键值对使用不正确的列表。
理由是 2 元组比 2 元素不正确列表多使用 1 个单词的内存。看
效率指南了解详细信息

OTP stdlib dictionary implementation dict module is using improper lists for key-value pairs.
The justification is 2-tuple uses 1 word more memory than 2-element improper list. See
efficiency guide for details

泡沫很甜 2024-10-26 04:35:22

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

OTP standard digraph module for directed graphs uses improper lists for tagged vertex and edge identifiers. For example, vertex 42 would be identified as ['$v'|42], which means a pair of an atom (no, not a character literal!) and an integer, similarly edge 97 would be ['$e'|97].

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文