Ошибка 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