我正在尝试编写一些Erlang来过滤表格中的数组:
[{dakota, "cold and snowy"}, {california, "perfect weather"}] % and so on
这就是我所拥有的 - 当我尝试从werl创建.beam时出现语法错误。
-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]).
有人能发现我的语法已关闭吗?
答案 0 :(得分:5)
我在推特上看到你对武器的呼唤,只是来看看。 :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) - &gt; Index和rstr(String,SubString) - &gt;在Erlang Manual:
中描述的索引返回SubString的第一个/最后一个出现在String中的位置。如果String中不存在SubString,则返回0。例如:
> 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).
答案 1 :(得分:3)
你错过了两个功能中的一个“结束”。此外,看起来不需要使用此示例中的列表推导。
答案 2 :(得分:2)
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]).
答案 3 :(得分:2)
你错过了其中一个乐趣的end
关键字。但是,看起来你正在搜索字符串。这通常是什么用途
-define(DATA,[{dakota, "cold and snowy"}, {california, "perfect weather"}]).无论如何,你的一个乐趣并未结束。就是这样。
string_contains(Big,Small)-> string:rstr(Big,Small) > 0.
findkeywords(Word)-> [X || X <- ?DATA,string_contains(element(2,X),Word) == true].