数据库功能 - Haskell初学者需要帮助!

时间:2011-07-06 22:08:21

标签: haskell

我是Haskell的新手,我正在努力从Addison-Wesley的书 - “功能编程工艺”中自学语言。

我坚持其中一个练习,并想知道是否有人可以提供帮助:

我需要定义一个函数

borrowed :: Database -> Book -> Bool

在库数据库上,可以检查数据库中的书是否已被借用,如果有,则返回True,如果没有,则返回False。这可能是一个非常简单的解决方案,但我似乎无法弄明白!任何帮助都会很棒

干杯

P

3 个答案:

答案 0 :(得分:2)

您只想查看Book是否出现在列表中的任何位置。看待这个的简单方法是通过书籍清单上的归纳。如果有一本书被借出,你想比较一下,

borrowed [(loan_to, loan_book)] key = loan_book == key

然后,当您查看更多书籍时,您想要检查您的密钥是否属于其中任何一个,

borrowed [] key = False
borrowed ((loan_to, loan_book):loans) key = key == loan_book || borrowed loans key

当您学习一些标准库函数时,可以将其清理为类似的内容,

borrowed loans key = any ((==key) . snd) loans

答案 1 :(得分:1)

我假设数据库是一个人和一个人检查过的书的对的列表。

import Data.List (find)
import Data.Maybe (isJust)

whoBorrowed :: Database -> Book -> Maybe Person
whoBorrowed database book = fmap fst $ find ((== book) . snd) database

borrowed :: Database -> Book -> Bool
borrowed database book = isJust $ whoBorrowed database book

你明白这意味着什么,或者你希望我为你扩展它?

编辑:

  • 从Control.Applicative中删除了<$>的使用;替换为fmap。他们的意思完全一样。
  • 从Control.Arrow中删除了second的使用;替换为. snd。实际上,我对second的使用是一个错误,现在已修复。

答案 2 :(得分:0)

any函数仅为此目的而定义!

borrowed db book = any (\(person, book') -> book' == book) db

当然,这种易于阅读的定义可能会以多种方式破坏。例如,有些人可能更喜欢这种形式:

borrowed db book = any ((book==) . snd) db