2011-06-03 63 views
6

我試圖混淆有關最近在Reddit /黑客新聞上彈出的'Scala One Liners'事件的哈斯克爾等價物。如何驗證某些項目是否在列表中?

這裏是我到目前爲止有(人大概可以做他們比我好很多,但這些都是我的初級嘗試)

https://gist.github.com/1005383

的一個我卡上,如果驗證項目在列表中。基本上斯卡拉的例子是這樣的

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!" 

要驗證的話一個存在,但斯卡拉示例詢問任何的詞表的話是存在於測試字符串。

我似乎無法找到contains函數或類似的東西。我知道你也許可以寫一個函數來做到這一點,但是這在一行中失敗了。

任何幫助,將不勝感激。

回答

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中輸入此類簽名。

+0

完美,謝謝! – djhworld 2011-06-03 07:55:01

6

如何使用Data.List.intersect

import Data.List.intersect 

not $ null $ intersect (words tweet) wordList 
3

雖然已經有了很好的答案,但我認爲使用any來編寫原始代碼的精神會很好。你這樣看如何組合,從簡單的可重複使用的零件自己複雜的查詢,而不是使用過的,現成的部件,如intersectelem

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

隨着一點點的重新排序,你可以在英語類的閱讀:在句子中是否有任何詞x,使得列表中有y這樣的x == y?很明顯,如何擴展到比'兩個軸'更多的軸,執行==以外的比較,甚至將它與all混合。

相關問題