Erlang列表过滤器语法

时间:2011-11-14 04:51:04

标签: erlang

我正在尝试编写一些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]).

有人能发现我的语法已关闭吗?

4 个答案:

答案 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]).

你可以稍微清理一下,除非这是你自己的字符串匹配练习。字符串模块有s​​tr(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].
无论如何,你的一个乐趣并未结束。就是这样。