编写一个函数来计算Erlang中列表中的整数之和

时间:2011-09-13 21:03:07

标签: erlang

因为我只是通过阅读书籍和自己的练习(不是为家庭作业)来学习Erlang,所以即使是我在标题中提到的最简单的任务,我也在努力。

这就是我所做的:

我使用以下代码行创建了一个名为sum.erl的文件:

-module(mysum).
-export([mysum/1]).

mysum(L) -> 
   mysum(L, 0).

mysum([H|T], acc) -> 
   mysum(T, H + acc); 

mysum([], acc) ->
   acc.

然后我编译:

erl sum.erl

带我到shell。在那里,我打字:

1> L = [1, 3, 7].
[1, 3, 7]
2> mysum(L).
** exception error: undefined shell command mysum/1
3>sum:mysum(L).
** exception error: undefined function sum:mysum/1

说什么?为什么我会收到这些错误,即使错误消息略有不同,我想也许他们的意思相差甚远?

更新:新代码

-module(sum).
-export([sum/1]).

sum(L) -> 
   sum(L, 0).

sum([H|T], Acc) -> 
   sum(T, H + Acc); 

sum([], Acc) ->
   Acc.

然后

1>L = [1,2,3].
[1,2,3]
2>sum:sum(L).
** exception error: no function clause matching sum:sum([1,2,3],0)

2 个答案:

答案 0 :(得分:8)

该文件应该被称为mysum.erl,与-module指令中的名称相同。 Erlang中的任何其他内容都是编译器错误。

确保您已在shell中使用c(mysum)对其进行编译(并且您位于mysum.erl所在的目录中。

由于您的模块名为mysum且导出的函数名为mysum,因此您应该使用以下命令调用它:

3> mysum:mysum(L)

此外,您将结果存储在acc中的变量应命名为Acc(大写a)。否则,它是一个原子,一旦调用function_clause,就会出现mysum(L, 0)错误,因为没有子句将0作为第二个参数处理(0仅与原子进行比较acc)。

答案 1 :(得分:3)

您的新代码似乎有效。尝试重新编译:

1> c(sum).
{ok,sum}    
2> sum:sum([1, 2, 3]).
6

erl命令将加载任何现有的.beam文件;重新加载代码需要显式编译。有关详细信息,请查看Learn You Some Erlang的Compiling the code部分。