我是Haskell的新手,我正在努力从Addison-Wesley的书 - “功能编程工艺”中自学语言。
我坚持其中一个练习,并想知道是否有人可以提供帮助:
我需要定义一个函数
borrowed :: Database -> Book -> Bool
在库数据库上,可以检查数据库中的书是否已被借用,如果有,则返回True,如果没有,则返回False。这可能是一个非常简单的解决方案,但我似乎无法弄明白!任何帮助都会很棒
干杯
P
答案 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
你明白这意味着什么,或者你希望我为你扩展它?
编辑:
<$>
的使用;替换为fmap
。他们的意思完全一样。second
的使用;替换为. snd
。实际上,我对second
的使用是一个错误,现在已修复。答案 2 :(得分:0)
any
函数仅为此目的而定义!
borrowed db book = any (\(person, book') -> book' == book) db
当然,这种易于阅读的定义可能会以多种方式破坏。例如,有些人可能更喜欢这种形式:
borrowed db book = any ((book==) . snd) db