Ошибка Erlang ** 1: синтаксическая ошибка до: '->' **

Я начал работать в Erlang, и я получаю: ** 1: syntax error before: '->' ** всякий раз, когда я объявляю какую-либо функцию, например. для вычисления суммы списка (это экспериментальный, курсовой есть встроенная функция для поиска суммы списка).

sum([]) -> 0;
sum([H | T]) -> H + sum(T).

в erl shell (v 5.5.5).

Заранее спасибо

Ответы

Ответ 1

Вы не можете определить функции в оболочке, используя тот же синтаксис, что и в файле erl.

Вы можете определить забаву, хотя.

Синтаксис в оболочке должен быть:

Sum = fun([], _) -> 0; ([H | T], F) -> H + F(T, F) end,
Sum([1,2,3], Sum).

Обратите внимание, что рекурсивные анонимные функции (которые это) определены уродливым способом. Вы в основном должны передавать функцию как аргумент себе.

Ответ 2

Прямой ответ заключается в том, что в файле определения модуля у вас есть атрибуты, такие как -module()., -export(). и т.д., и определения функций, в то время как в оболочке вы вводите выражения для оценки. Определение функции не является выражением.

Если вы хотите определить локальную временную функцию в оболочке, вам нужно использовать приложение fun, как показала @DanielLuna. Это действительно анонимные неназванные функции, поэтому их рекурсивное обращение - это боль, которая не характерна для Erlang, но является общей для всех анонимных функций.

N.B.

Sum = fun([], _) -> 0; ([H | T], F) -> H + F(T, F) end.

в оболочке НЕ определяет функцию с именем Sum, но определяет анонимную функцию и привязывает к ней переменную Sum.

Именно поэтому единственное, что вы можете сделать в модуле - это определить функции, а не выражения, которые будут оцениваться при загрузке модуля.

Ответ 3

Или используйте списки: foldl/2. Это копируется непосредственно из справочного руководства Erlang.

1> lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
15