2013-04-16 2 views
1

Я очень новичок в Erlang, и я пытаюсь скомпилировать свою первую программу, и во время компиляции я получаю синтаксическую ошибку.Основы Erlang: ошибка синтаксиса во время компиляции

Ошибка синтаксиса. Я получаю очки к строке 2 filter_inside undefined. Также синтаксическая ошибка на последней строке перед X.

functions.erl

-module(functions). 
-export([filteri/2]). 

filteri(_, []) -> 
        []; 
filteri(P,[X|XS]) -> 
        [(map(P) X)|filteri P XS]. 

Я пытался отладить около часа, в настоящее время не имела успеха, мне было интересно, если кто-то может помочь мне определить, что речь идет о коде, который делает его не компиляции.

Большое спасибо заранее!

ответ

2

Последняя строка [(map(P) X)|filter_inside P XS]. должно быть [P(X) | filter_inside(P, XS)]. Синтаксис необходимо исправить. Вы ищете приложение карты и предикат, чтобы вернуть результат, то есть реализовать lists:map.

Ex: lists:map(fun(A)->A*2 end, [1,2,3,4,5])., чтобы получить результат, как эквивалент [2,4,6,8,10]

Тогда в Erlang вы также можете написать так, чтобы использовать оптимизацию хвостовой рекурсии:

-module(functions). 
-export([filter_inside/2]). 

filter_inside(P,L) -> 
    filter_inside(P,L, []). 

filter_inside(_, [], Acc) -> 
    lists:reverse(Acc); 
filter_inside(P,[X|XS], Acc) -> 
    filter_inside(P, XS, [P(X) | Acc]). 
+1

Но необходимость перечеркнуть список удаляет много выигрыша, см. Http://www.erlang.org/doc/efficiency_guide/myths.html#tail_recursive – rvirding

+1

Я сделал пробег во времени, filter_inside2 - хвост рекурсивный '2> таймер: tc (cmd, filter_inside2, [fun (A) -> A * 2 end, lists: seq (1,10000000)]). {25707000, [2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42, 44 , 46,48,50,52,54 | ...]} 3> timer: tc (cmd, filter_inside, [fun (A) -> A * 2 end, lists: seq (1,10000000)]). {48666000, [2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42, 44 , 46,48,50,52,54 | ...]} ' – Vinod

+0

Кроме того, пространство занимало около 200 МБ в хвосте и 300 МБ с рекурсивной функцией тела (используемый сырой метод, просматривая память процесса) на 64-битной машине. Только 100 мс было быстрее, когда списки: реверс был удален, и я не видел изменения пространства. – Vinod

4

Erlang разделяет пункты по точкам с запятой ;.

Заявления разделяются запятой ,.

Просто используйте []; в 5-й строке.

Последняя строка также сломана. Чтобы добавить элемент Head в список Tail, используйте [Head|Tail], включая скобки.

Вызов функции выглядит как Fun(Arg1, Arg2, ...).

Erlang чувствителен к регистру. x - это атом (вы можете видеть его как строчную константу), тогда как X является переменной X.

Прост в использовании, чем явная рекурсия - это список постигает [Fun(X) || X <- XS] (или [Fun(X) || X <- XS, Predicate(X)]).

Я думаю, вы могли бы использовать

filter_inside(Fun, XSS) -> 
    [ [Fun(X) || X <- XS] || XS <- XSS ]. 

В вашем решении вы можете использовать это в качестве последней строки:

[list:map(P, X)|filter_inside(P, XS)]. % Mind the function call syntax. 

Erlang сообщил проблему в -export линии, потому что функция содержала ошибку, поэтому имя неизвестно.

Еще один комментарий: используйте filter_inside(_, []) как последнее предложение для ускорения.

+0

Спасибо за ответ. Я все еще получаю синтаксическую ошибку до 'x' в последней строке. Также в строке два 'export', какие-либо предложения? – AnchovyLegend

+0

Я не понимаю вашего намерения в последнем пункте. '[??| filter_inside (P, XS)] ', что должно произойти в вопросительных знаках? (Синтаксис Erlang практически не похож на Haskell. Не пытайтесь адаптироваться оттуда.) – kay

+0

Это именно то, откуда я берусь, Hasekll ... Я пытаюсь рекурсивно применить карту и Predicate P к каждому элементу списка списков. (См. Отредактированный код с настройками) – AnchovyLegend