2015-04-13 2 views
0

Я уже два месяца возился с Haskell и имел некоторые функции, написанные в Haskell. Я слышал, что Эрланг был очень похож (так как оба они преимущественно функциональны), поэтому я решил перевести некоторые из этих функций, чтобы посмотреть, смогу ли я заставить их работать в Эрланге. Однако у меня возникли проблемы с синтаксисом для этой функции, которую я написал. Цель этой функции - просто взять символ или int и пройти через список. После того, как он пройдет через список, я просто пытаюсь подсчитать количество раз, когда этот элемент происходит. Вот пример выполнения, он должен вернуть следующее.Граф Появление элемента в списке (Erlang)

count (3, [3, 3, 2, 3, 2, 5]) ----> 3 
count (c, [ a, b, c, d]) ----> 1 

Всякий раз, когда я запускаю мой код он просто продолжает выплевывать вопросы синтаксиса и это действительно доводка боли в Erlang. Вот код, который я написал:

count(X,L) -> 
    X (L:ls) -> 
    X == L = 1+(count X ls); 
    count X ls. 

Любые идеи, которые я могу сделать, чтобы исправить это?

ответ

7

Непонятно, для чего вы собираетесь, поскольку ваш синтаксис довольно далек. Тем не менее, вы могли бы выполнить свой вызов с чем-то вроде этого:

count(Needle, Haystack) -> count(Needle, Haystack, 0). 

count(_, [], Count) -> Count; 
count(X, [X|Rest], Count) -> count(X, Rest, Count+1); 
count(X, [_|Rest], Count) -> count(X, Rest, Count). 

Для разработки, вы создаете рекурсивную функцию с именем count найти экземпляры Needle в Haystack. При каждом вызове есть три случая: базовый случай, в котором вы искали весь список; случай, в котором значение, которое вы ищете, соответствует первому элементу в списке; и случай, в котором значение, которое вы ищете, не соответствует первому элементу в списке. Каждый случай отдельное определение функции:

count(_, [], Count) -> Count; 

Матчи случай, в котором Haystack (т.е. список сканировании) пуст. Это означает, что вам больше не нужно искать, и вы можете вернуть количество раз, когда вы нашли значение, которое вы ищете в списке.

count(X, [X|Rest], Count) -> count(X, Rest, Count+1); 

Матчи случая, в котором значение, которое вы ищете, X, соответствует первому элементу в списке. Вы хотите продолжить поиск в списке для большего количества совпадений, но вы увеличиваете счетчик перед тем, как снова позвонить count.

count(X, [_|Rest], Count) -> count(X, Rest, Count). 

Матчи случай, в котором значение, которое вы ищете делает не матч во главе списка. В этом случае вы продолжаете сканировать остальную часть списка, но вы не делаем приращиваете счетчик.

Наконец,

count(Needle, Haystack) -> count(Needle, Haystack, 0). 

Является ли помощник, который называет версию три-аргумента функции с начальным подсчетом 0.

Смежные вопросы