如何验证某些项目是否在列表中?

时间:2011-06-03 07:39:51

标签: haskell

我正在试图尝试使用最近出现在Reddit / Hacker News上的'Scala One Liners'的haskell等等。

这是我到目前为止所做的事情(人们可能会比我做得更好,但这些是我初学者的尝试)

https://gist.github.com/1005383

我坚持的是验证物品是否在列表中。基本上Scala的例子就是这个

val wordlist = List("scala", "akka", "play framework", "sbt", "typesafe")
val tweet = "This is an example tweet talking about scala and sbt."
(words.foldLeft(false)( _ || tweet.contains(_) ))

我有点难过如何在Haskell中做到这一点。我知道你可以这样做:

any (=="haskell") $ words "haskell is great!"

验证是否存在一个单词,但Scala示例会询问单词列表中的任何单词是否出现在测试字符串中。

我似乎找不到contains函数或类似的函数。我知道你可能会编写一个函数来执行此操作但是在一行中无法完成此任务。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:11)

您可以使用Prelude中的elem函数来检查项目是否在列表中。它通常以中缀形式使用:

Prelude> "foo" `elem` ["foo", "bar", "baz"]
True

然后,您可以像操作==一样在操作符部分中使用它:

Prelude> let wordList = ["scala", "akka", "play framework", "sbt", "types"]
Prelude> let tweet = "This is an example tweet talking about scala and sbt."
Prelude> any (`elem` wordList) $ words tweet
True

当您发现自己需要某个功能但却不知道该名称时,请尝试使用Hoogle按类型搜索功能。

在这里你需要一些东西来检查任何类型的东西是否在同一类型的东西列表中,即像a -> [a] -> Bool这样的类型(你还需要一个Eq约束,但是让我们说你不知道那个)。将此类型签名键入Hoogle gives you elem as the top result

答案 1 :(得分:6)

如何使用Data.List.intersect

import Data.List.intersect

not $ null $ intersect (words tweet) wordList

答案 2 :(得分:3)

虽然已有很好的答案,但我认为使用any以原始代码的精神写出一些东西会很好。这样,您就可以了解如何使用简单的可重用部分构建自己的复杂查询,而不是使用intersectelem等现成部分:

any (\x -> any (\y -> (y == x)) $ words "haskell is great!")
    ["scala", "is", "tolerable"]

通过稍微重新排序,您可以用英语阅读:句子中是否有x字样,列表中有yx == y?很清楚如何扩展到更多“轴”而不是两个,执行==以外的比较,甚至将其与all混合。