2015-06-18 34 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] 

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