2014-03-27 104 views
2

我是Haskell的新手,我正在寫一個簡單的函數來計算字符串中子字符串的出現次數。在一個句子中計算特定單詞的出現haskell

例如:"There is an apple"我想在句子中計算"is"多少次,在這種情況下結果應該是1

這是我已經試過:

countOf :: String -> Int 
countOf x = length [n | n <- words x, filter "is" x] 

據我研究過它應該工作,但事實並非如此。我真的不知道該如何解決這個問題,而且不知道什麼錯誤消息我得到手段:

input:1:41: 
    Couldn't match expected type `Bool' with actual type `[a0]' 
    In the return type of a call of `filter' 
    In the expression: filter "a" x 
    In a stmt of a list comprehension: filter "a" x 

回答

9

功能filter具有類型

filter :: (a -> Bool) -> [a] -> [a] 

這意味着它的第一個參數是另一個函數,它接受一個元素並返回一個Bool,它將此函數應用於第二個參數的每個元素。您將String作爲第一個參數而不是函數。也許你想要更類似於

countOf x = length [n | n <- words x, filter (\w -> w == "is") x] 

但是這也行不通!這是因爲在列表理解中的任何額外表達必須是Bool,而不是列表。 filter返回元素列表,而不是Bool,這實際上是編譯器錯誤的來源,它期望Bool,但它看到的類型爲[a0]的列表(它甚至沒有足夠遠以實現它應該是[String]) 。

相反,你可以做

countOf x = length [n | n <- words x, n == "is"] 

,這將是相當於

countOf x = length (filter (\w -> w == "is") (words x)) 

或者與$

countOf x = length $ filter (\w -> w == "is") $ words x 

哈斯克爾實際上將讓我們進一步簡化這

countOf x = length $ filter (== "is") $ words x 

它使用所謂的操作員部分。然後,你可以把它完全指向免費爲

countOf = length . filter (== "is") . words 
+0

謝謝你,這是真的很有幫助。我可以問你的建議,我可以在哪裏閱讀更多關於這個表達式「filter ::(a - > Bool) - > [a] - > [a]」的意思,以及其他任何我可以學習haskell的東西。在互聯網上的一些教程,但他們沒有用。 – Syngularity

+1

@Syngularity你有沒有簽出[LYAH](http://learnyouahaskell.com/chapters)?這是真正讓我開始的教程。之後,我會推薦Real World Haskell書籍,該書也可免費在線獲取。 [Haskell School](https://www.fpcomplete.com/school)還有很多很好的教程。 – bheklilr

0

我會做這樣的:

countOf :: String -> Int 
countOf x = length [n | n <- words x, compare "is" n == EQ] 

演示了ghci:

ghci> countOf "There is an apple" 
1 
0

你可以把比較直的理解:

countOf x = length [n | n <- words x, n == "is"] 
0

其實,你試着算在一個的出現次數的數量串。如果你尋找一個字符串:

import Data.List (inits, tails) 

countOf = length . filter (=="is") . conSubsequences 
    where 
    conSubsequences = concatMap inits . tails 
0

人們還可以嘗試foldr相似:

countOf :: String -> Int 
countOf x = foldr count 0 (words x) 
    where 
    count x acc = if x == "is" then acc + 1 else acc 
相關問題