【问题标题】:Erlang on Windows List Comprehension multiply gives "\f"Windows List Comprehension 上的 Erlang 乘以“\f”
【发布时间】:2014-01-14 14:08:54
【问题描述】:

您好,我在运行 16B 和 WinXP 的 Windows 上遇到了一个奇怪的 Erlang 问题。

我有以下代码

-module(test).
-export([cost/1,total/1]).
cost(orange) ->
    5;
cost(apple) ->
    6.

total(L) ->
    [cost(I) * Q || {I,Q} <- L].

我运行它

test:total([{orange,2}]).

它给了我 "\f"

改变 cost(I) * Q 使用 -,+ 或除法给我一个数字。

我不知道为什么乘法在列表理解中不起作用。运行

[test:cost(I) * Q || {I,Q} <- [{orange,2}]]

在 erlang 控制台和 emacs 模式下也不起作用,但是

test:cost(orange) * 2

确实给了我一个号码。

有什么想法吗?

【问题讨论】:

标签: windows erlang


【解决方案1】:

字符串是整数列表。您返回的值是整数列表。

Erlang 使用一个简单的启发式方法来判断何时将某些内容显示为字符串或整数列表:它是一个仅包含 {55,250} 范围内的数字的平面列表。 (这些数字是我编出来的,不过是这样的。如果有控制字符或低字符,它会保释。)

由于 Erlang 不对元组执行此操作,因此元组使其易于查看。

1> {72,101,108,108,111,44,32,83,116,101,112,104,101,110,46}.
{72,101,108,108,111,44,32,83,116,101,112,104,101,110,46}

2> [72,101,108,108,111,44,32,83,116,101,112,104,101,110,46].
"Hello, Stephen."

Erlang 只是猜错了列表中的内容。

HTH。

【讨论】:

    【解决方案2】:

    请注意,您的 cost/1 函数返回一个数字。但是 total/1 返回一个 list (数字)。 该列表上的结果还可以,这就是 erlang 恰好显示小整数列表的方式。见http://www.erlang.org/faq/problems.html9.3

    要明白我的意思,请尝试使用更大的数字

    test:total([{orange,2000}]).
    

    同样,这只是一个显示问题,列表中的值是您所期望的。试试看:

    [Value] = test:total([{orange,2}]).
    Value.
    

    【讨论】:

    • 谢谢 pplov,我刚开始使用 erlang。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多