因为我只是通过阅读书籍和自己的练习(不是为家庭作业)来学习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)
答案 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部分。