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

时间:2016-04-20 08:18:05

标签: haskell

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]。

链接到上一个问题: Removing repeated elements from a list in Haskell

1 个答案:

答案 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