gpt4 book ai didi

erlang - Erlang 中的异常错误

转载 作者:行者123 更新时间:2023-12-04 15:04:50 26 4
gpt4 key购买 nike

所以我在过去的八个小时里一直在使用 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 的任何数字作为参数运行相同的函数时,我得到以下异常...

**exception error: no function clause matching dice2:d6(1, [4|3])



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

我试着像这样修改有问题的函数......
d6(Numdice, [Result]) ->
Newresult = [random:uniform(6) | Result],
d6(Numdice - 1, Newresult).

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

最佳答案

这基本上是一个类型错误。当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]).

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

关于erlang - Erlang 中的异常错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2762815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com