Hello Stackoverflow社区,代表我的另一个相当基本的问题:
大约五年前有一个问题要求"从Haskell的列表中删除重复的元素。"我有类似的问题,albiet有一定程度的并发症。
假设我有这些数据类型:
data Library = Library {borrower :: String, book :: [Book]}
data Book = Book {title :: String, barcode :: Integer}
然后说我有这个功能:
addBook :: Book -> Library -> Library
addBook book library = library {book = book : getBooks library}
其中getBooks只是一个从库中提取[Book]的函数。
显然,只要拉尔夫没有借用重复的书籍,这个功能就可以了。然而,如果他这样做,那么书籍列表中就会出现重复,这是不可取的。
我如何编写一个返回当前[Book]的函数,但是也会删除任何重复项?我在帖子开头的问题中尝试了这个方法,但是编译器抱怨它特别想要[Book]而不是[a]。
答案 0 :(得分:2)
易。
首先让Book
成为Eq
的实例:
data Book = Book {title :: String, barcode :: Integer} deriving Eq
然后修复函数addBook
以过滤库中已有的图书(使用elem
函数):
addBook :: Book -> Library -> Library
addBook book library = if elem book (getBooks library)
then library -- The library already contains this book
else library {book = book : getBooks library}
elem
函数具有以下签名:
elem :: a -> [a] -> Bool