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

djh*_*rld 6 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(_) ))
Run Code Online (Sandbox Code Playgroud)

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

any (=="haskell") $ words "haskell is great!"
Run Code Online (Sandbox Code Playgroud)

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

我似乎无法找到一个contains功能或类似的东西.我知道你可能会编写一个函数来完成它,但是这样就无法在一行中完成这项任务.

任何帮助,将不胜感激.

ham*_*mar 11

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

Prelude> "foo" `elem` ["foo", "bar", "baz"]
True
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

在这里你想要的东西可以检查任何类型的东西是否在同一类型的东西列表中,例如某种类型的东西a -> [a] -> Bool(你也需要一个Eq约束,但是假设你不知道那个).将此类型签名键入Hoogle会将elem作为最佳结果.


nim*_*odm 6

怎么用Data.List.intersect

import Data.List.intersect

not $ null $ intersect (words tweet) wordList
Run Code Online (Sandbox Code Playgroud)