【问题标题】:Simulating range(L,N) in erlang在erlang中模拟范围(L,N)
【发布时间】:2012-10-04 12:31:17
【问题描述】:

一大早玩 Erlang 我得到了一个奇怪的结果:

   -module(bucle01).

   -compile(export_all).

   for(N) when N >=0 ->

                lists:seq(1,N).


   for(L,N) when L =< N ->

                lists:seq(L,N);

   for(L,N) when L > N ->

                lists:reverse(for(N,L)).

当我运行程序时,我看到:

> bucle01:for(1,10).

[1,2,3,4,5,6,7,8,9,10]

> bucle01:for(10,1).

[10,9,8,7,6,5,4,3,2,1]

>bucle01:for(7,10).

[7,8,9,10]

>bucle01:for(8,10).

"\b\t\n"                %% What's that !?!

>bucle01:for(10,8).

"\n\t\b"               %% After all  it has some logic !

请给“不要喝太多”的“Kool-Aid”吗?

【问题讨论】:

    标签: list erlang range seq


    【解决方案1】:

    Erlang 中的字符串只是 ASCII 数字的列表。 Erlang shell 会尝试在不使用元数据的情况下通过查找可打印字符来确定您的列表是数字列表还是字符串。

    \b(退格)、\t(制表符)和@​​987654325@(换行符)都是一些常见的 ASCII 字符,因此 shell 显示的是字符串而不是数字。但是,列表的内部结构完全相同。

    这也包含在 Erlang 常见问题解答中: Why do lists of numbers get printed incorrectly?
    这里有一些想法可以防止这种魔法:Can I disable printing lists of small integers as strings in Erlang shell?

    【讨论】:

    • -模块(bucle01)。 -编译(export_all)。 -spec for(L::integer,N::integer) -> 整数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多