Синтаксис фильтра списка Erlang - PullRequest
3 голосов
/ 14 ноября 2011

Я пытаюсь написать какой-нибудь Erlang, который бы фильтровал массив в виде:

[{dakota, "cold and snowy"}, {california, "perfect weather"}] % and so on

Вот что у меня получилось - я получаю синтаксическую ошибку при попытке сделать .beam из werl.

-module(matcher).
-export([findkeywords/2]).

findkeywords(Word, Arr) -> 
    IsMatch = fun({Key, Desc}) -> 
        lists:any(fun(X) -> X==Word end, string:tokens(Desc, " ")),
    lists:filter(IsMatch, [{K, V} || {K, V} <- Arr]).

Может кто-нибудь определить, где мой синтаксис выключен?

Ответы [ 4 ]

5 голосов
/ 14 ноября 2011

Я видел твой призыв к оружию в твиттере и просто должен был прийти посмотреть.: D

Если вы хотите, чтобы это скомпилировалось, вы просто упускаете конец веселья в строке 6. Добавьте его, и он скомпилируется без жалоб.

-module(matcher).
-export([findkeywords/2]).

findkeywords(Word, Arr) -> 
    IsMatch = fun({Key, Desc}) -> 
        lists:any(fun(X) -> X==Word end, string:tokens(Desc, " ")) end, % ADD THE END HERE
    lists:filter(IsMatch, [{K, V} || {K, V} <- Arr]).

Вы можете очиститьэто тоже немного, если только это не упражнение в сопоставлении строк для себя.Строковый модуль имеет str (String, SubString) -> Index и rstr (String, SubString) -> Index, которые описаны как таковые в Erlang Manual :

Возвращает позицию, в которойПервое / последнее вхождение SubString начинается в String.0 возвращается, если SubString не существует в String.Например:

> string:str(" Hello Hello World World ", "Hello World").
8 

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

-module(matcher).
-export([findkeywords/2]).

findkeywords(Word, Arr) -> 
    lists:filter(fun({_Key, Desc}) -> string:str(Desc, Word) > 0 end, Arr).
3 голосов
/ 14 ноября 2011

Вы пропускаете один «конец» из двух функций. Кроме того, похоже, что понимание списка в этом примере не требуется.

2 голосов
/ 14 ноября 2011

Вам не хватает ключевого слова end для одного из забав.Тем не менее, похоже, что вы ищете в строках.Это обычно то, что используется

-define(DATA,[{dakota, "cold and snowy"}, {california, "perfect weather"}]).<br>
string_contains(Big,Small)-> string:rstr(Big,Small) > 0.<br>
findkeywords(Word)-> [X || X <- ?DATA,string_contains(element(2,X),Word) == true].
Во всяком случае, одно из ваших развлечений не закончилось хорошо.это все.
2 голосов
/ 14 ноября 2011
findkeywords(Word, Arr) -> 
    IsMatch =
    fun({_, Desc}) -> lists:any(fun(X) -> X == Word end, string:tokens(Desc, " ")) end,
    lists:filter(IsMatch, [{K, V} || {K, V} <- Arr]).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...