如何在列表中搜索匹配的项目?

lit*_*tos 0 haskell list abstract-data-type

我正在练习明天练习考试.该文本告诉我将数据库实现到库中,以定义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?-}
Run Code Online (Sandbox Code Playgroud)

现在,我需要创建一个名为的函数books :: Database -> String -> [Item],它在我的数据库中按名称搜索并向我提供该人请求的书籍.

我该怎么做呢?

bhe*_*ilr 5

使用该filter函数这非常简单:

filter :: (a -> Bool) -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

它需要一个条件来应用于列表的每个元素,然后返回满足该条件的所有元素的列表.在您的情况下,您想要查找特定人员所要求的书籍.您可以将其分解为两个问题:

  1. 查找给定人员的所有请求
  2. 查找Requisition列表中的所有书籍

我们说要解决第一个问题

requestsFromPerson :: Database -> String -> Database
requestsFromPerson db name = filter matchesName db
    where
        matchesName (Req name' item) = name == name'
Run Code Online (Sandbox Code Playgroud)

第二步也可以用filter,但我会让你填写实现

onlyBooks :: Database -> Database
onlyBooks db = filter ??? db
Run Code Online (Sandbox Code Playgroud)

然后你可以结合这两个:

books db name = onlyBooks (requestsFromPerson db name)
Run Code Online (Sandbox Code Playgroud)

所以你所要做的就是填写???for onlyBooks,这应该工作!提示:模式匹配是你的朋友.