Haskell-从ADT中的ADT列表中删除重复的元素

Haskell-从ADT中的ADT列表中删除重复的元素,haskell,Haskell,你好,Stackoverflow社区,代表我提出另一个相当基本的问题: 大约五年前有一个问题问到“从Haskell的列表中删除重复的元素。”我有类似的问题要问,albiet有一定程度的复杂性 假设我有以下数据类型: data Library = Library {borrower :: String, book :: [Book]} data Book = Book {title :: String, barcode :: Integer} 然后说我有这个功能: addBook :: Book

你好,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}
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}
其中getBooks只是一个从库中提取[Book]的函数

显然,只要拉尔夫不借书,这个函数就可以了。然而,如果他这样做了,那么书单上就会有一个副本,这是不可取的

我该如何编写一个返回当前[Book]的函数,同时删除任何重复项?在文章的开头,我在前面提到的问题中尝试了这个方法,但是编译器抱怨说它特别想要[Book]而不是[a]

链接到上一个问题: 简单

首先将
Book
作为
Eq
的一个实例:

data Book = Book {title :: String, barcode :: Integer} deriving Eq
然后修复函数
addBook
,以过滤库中已有的书籍(使用
elem
函数):

elem
函数具有以下签名:

elem :: a -> [a] -> Bool

使用
nub::Eq a=>[a]->[a]
怎么样?请注意,您需要提供(或派生)一个
Eq
实例。