Напишите функцию, которая вычисляет сумму целых чисел в списке в Erlang - PullRequest
2 голосов
/ 14 сентября 2011

Поскольку я изучаю эрланг, просто читая книги и выполняя свои собственные упражнения (НЕ для домашней работы), я борюсь даже с самой простой задачей, которую я упомянул в названии.

Вот что ясделали:

Я создал файл с именем 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

, который берет меняв оболочку.Там я набрал:

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 ]

8 голосов
/ 14 сентября 2011

Файл должен называться mysum.erl, так же, как имя в директиве -module. Все остальное - ошибка компилятора в Erlang.

Убедитесь, что вы скомпилировали его, используя c(mysum) в оболочке (и вы находитесь в каталоге, в котором находится mysum.erl.

Так как ваш модуль называется mysum, а экспортируемая функция называется mysum, то вы должны вызывать его с помощью:

3> mysum:mysum(L)

Кроме того, переменная, в которой вы сохраняете результаты, acc, должна иметь имя Acc (заглавная a). В противном случае это атом, и вы получите ошибку function_clause, как только вы вызовете mysum(L, 0), поскольку ни одно из предложений не обрабатывает 0 в качестве второго аргумента (0 по сравнению с атомом acc).

3 голосов
/ 14 сентября 2011

Ваш новый код, кажется, работает. Попробуйте перекомпилировать:

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

Команда erl загрузит все существующие .beam файлы; явная компиляция необходима для перезагрузки вашего кода. Проверьте Компиляция кода раздел Learn You Some Erlang для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...