Erlang中的异常错误

Erlang中的异常错误,erlang,exception,Erlang,Exception,所以在过去的八个小时里我一直在使用Erlang,我花了两个小时的时间用头敲击键盘,试图找出我的控制台不断返回的异常错误 我正在写一个骰子程序来学习erlang。我希望它能够通过erlang解释器从控制台调用。该程序接受大量骰子,并应生成一个值列表。每个值应介于1和6之间 我不会让你厌烦我为试图解决这个问题(随机工程)所做的几十个微小的改变,但我会发布我的代码和错误 资料来源: -module(dice2). -export([d6/1]). d6(1) -> random:uni

所以在过去的八个小时里我一直在使用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]匹配的函数子句

。。。我知道我没有一个具有匹配参数的函数,但我不知道如何编写具有可变参数和可变数量参数的函数

我试着像这样修改这个函数

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

。。。但我基本上也犯了同样的错误。有人知道这里发生了什么吗?

这基本上是一个类型错误。当
Result
是一个列表时,
[Result]
是一个包含一个元素的列表。例如,如果函数工作,它将始终返回一个包含一个元素的列表:
Finalresult

这就是发生的情况(使用
==>
表示“减少到”):

想必,您不希望在第一次调用中
[[]]
,也不希望在第三次调用中
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)
子句。
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]).