2015-06-18 30 views
0

我正在爲明天的考試練習練習。 該文本告訴我實現一個數據庫到一個庫,以定義Item s可以是書籍或雜誌。爲每本書保存名稱+作者。對於每個Magazine我保存名稱:如何搜索列表中的匹配項目?

data Item = Book String String 
     | Magazine String 
     deriving(Show) 

data Requisition = Req String Item 

type Database = [Requisition] 

exDB :: Database 
exDB = [Req "John" (Book "PF" "HS"),Req "Jay"(Book "Apple" "Steve Jobs"),Req "Francis"(Magazine "Forbes")] 

books :: Database -> String -> [Item] 
books db name = {-- what's next?-} 

現在,我需要創建一個名爲books :: Database -> String -> [Item]功能,即通過搜索名字在我的數據庫,並給了我這個人請求書。

我該怎麼做?

回答

5

這是非常簡單的使用功能filter

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

它需要一個條件,應用到列表中的每個元素,然後返回滿足條件的所有元素的列表。在你的情況下,你想查找一個給定的人要求什麼書。你可以將其分爲兩個問題:

  1. 找到一個給定的人
  2. 所有請求查找所有書籍在Requisition列表

爲了解決第一個,我們說

requestsFromPerson :: Database -> String -> Database 
requestsFromPerson db name = filter matchesName db 
    where 
     matchesName (Req name' item) = name == name' 

第二步也可以用filter完成,但我要讓你填寫執行

onlyBooks???

books db name = onlyBooks (requestsFromPerson db name) 

因此,所有你需要做的就是填補,這應該工作:

onlyBooks :: Database -> Database 
onlyBooks db = filter ??? db 

然後,你可以結合這兩種!提示:模式匹配是你的朋友。

1
books db name = [... | Req n [email protected](Book _ _) <- db, n==name] 

使用列表解析,不匹配的項目只是跳過。模式可以嵌套。