【问题标题】:Erlang List Filter SyntaxErlang 列表过滤器语法
【发布时间】:2011-12-28 09:12:26
【问题描述】:

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

谁能发现我的语法有问题?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    你错过了这两个函数的一个“结束”。此外,似乎不需要此示例中使用的列表推导式。

    【讨论】:

    • 它会删除列表中不是两个元素元组的所有元素,但我会在乐趣中添加一个额外的子句。
    【解决方案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】:

      您错过了其中一个乐趣的 end 关键字。但是,看起来您正在字符串中搜索。这通常是有用的

      -define(数据,[{达科他州,“寒冷多雪”},{加利福尼亚州,“完美天气”}])。
      string_contains(Big,Small)-> string:rstr(Big,Small) > 0.
      查找关键字(字)-> [X || X 无论如何,你的一个乐趣并没有很好地结束。就这样。

      【讨论】:

      • 另一位乌干达黑客前来救援! :) 我只是在学习一个教程,所以我没有遇到 -define 或 element 这就是我使用基本元组的原因。但是,如果有什么更好的方法来打包原始数据结构,那么这种清理会很有帮助。
      • 你不需要== true 部分;)
      【解决方案4】:

      我在推特上看到了你的号召,只好过来看看。 :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]).
      

      您也可以稍微清理一下,除非这是您自己进行字符串匹配的练习。 string 模块有 str(String, SubString) -> Index 和 rstr(String, SubString) -> Index,在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).
      

      【讨论】:

      • 感谢您提供的详细信息并回答我的“战斗号召!”
      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 2013-04-06
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 2023-03-23
      相关资源
      最近更新 更多