【问题标题】:Exception error in ErlangErlang中的异常错误
【发布时间】:2011-02-15 07:26:04
【问题描述】:

所以在过去的八小时里我一直在使用 Erlang,其中有两个小时我用头敲击键盘试图找出我的控制台不断返回的异常错误。

我正在编写一个骰子程序来学习 erlang。我希望它能够通过 erlang 解释器从控制台调用。该程序接受许多骰子,并且应该生成一个值列表。每个值都应该在 1 到 6 之间。

我不会对我为尝试解决问题(随机工程)所做的几十个单独的微更改而感到厌烦,但我会发布我的代码和错误。

来源:

-module(dice2).
-export([d6/1]).

d6(1) ->
    random:uniform(6);
d6(Numdice) ->
    Result = [],
    d6(Numdice, [Result]).

d6(0, [Finalresult]) ->
    {ok, [Finalresult]};

d6(Numdice, [Result]) ->
    d6(Numdice - 1, [random:uniform(6) | Result]).

当我像这样从控制台运行程序时... dice2:d6(1).

...我得到一个 1 到 6 之间的随机数,如预期的那样。 但是,当我以任何大于 1 的数字作为参数运行相同的函数时,我得到以下异常...

**异常错误:没有函数子句匹配 dice2:d6(1, [4|3])

...我知道 II 没有具有匹配参数的函数,但我不知道如何编写具有可变参数和可变参数的函数 number。

我尝试像这样修改有问题的函数....

d6(Numdice, [Result]) ->
    Newresult = [random:uniform(6) | Result],
    d6(Numdice - 1, Newresult).

...但我得到了基本相同的错误。有人知道这里发生了什么吗?

【问题讨论】:

    标签: erlang exception


    【解决方案1】:

    这基本上是一个类型错误。当Result 是一个列表时,[Result] 是一个包含一个元素的列表。例如,如果您的函数有效,它总是会返回一个包含一个元素的列表:Finalresult。

    会发生这种情况(使用==> 表示“减少到”):

    d6(2) ==> %% Result == []
    d6(2, [[]]) ==> %% Result == [], let's say random:uniform(6) gives us 3
    d6(1, [3]) ==> %% Result == 3, let's say random:uniform(6) gives us 4
    d6(0, [4|3]) ==> %% fails, since [Result] can only match one-element lists
    

    大概,您不希望[[]] 在第一次通话中,并且您不希望Result 在第三次通话中为 3。所以这应该解决它:

    d6(Numdice) ->  Result = [], d6(Numdice, Result). %% or just d6(Numdice, []).
    
    d6(0, Finalresult) -> {ok, Finalresult};
    d6(Numdice, Result) -> d6(Numdice - 1, [random:uniform(6) | Result]).
    

    教训:如果一种语言是动态类型的,这并不意味着您可以避免获得正确的类型。相反,这意味着编译器不会尽其所能帮助您。

    【讨论】:

    • 您的解决方案效果很好,帮助我理解了我的错误。我是功能范式的新手,所以有很多东西要吸收。我感到困惑的地方是通过使用空列表调用 d6(Numdice, Result) 来思考,任何新调用最终都只能匹配一个空列表作为 d6 的参数之一,因为您无法重新绑定变量范围。我想我忘记了绑定规则只适用于给定函数之前下一次调用[翻白眼]。我陷入了匹配问题,忘记了元素长度。不管怎样,谢谢你回答我的问题。
    • 别忘了你可以投票和接受答案:)
    • 只是为了完整性:d6(1) 给你一个数字,但例如d6(2) 给你{ok, [Value1, Value2]} 这可能会导致其他错误。
    • 好点!我认为最好只删除 d6(1) 子句。
    猜你喜欢
    • 2016-05-04
    • 2020-06-23
    • 2019-02-27
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 2015-01-14
    相关资源
    最近更新 更多