Я видел твой призыв к оружию в твиттере и просто должен был прийти посмотреть.: 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).