Erlang получает ошибку ** 1: синтаксическая ошибка перед: '->' ** - PullRequest
15 голосов
/ 31 августа 2010

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

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

в оболочке erl (v 5.5.5).

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

Ответы [ 3 ]

38 голосов
/ 01 сентября 2010

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

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

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

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

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

9 голосов
/ 01 сентября 2010

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

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

NB

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

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

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

0 голосов
/ 03 сентября 2010

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

1> lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...