【问题标题】:Haskell - removing repeated elements from an ADT list in an ADTHaskell - 从 ADT 中的 ADT 列表中删除重复元素
【发布时间】:2016-04-20 08:18:05
【问题描述】:

你好 Stackoverflow 社区,代表我的另一个相当基本的问题:

大约五年前有人问过一个问题,即“从 Haskell 的列表中删除重复的元素”。我有类似的问题要问,虽然有一定程度的复杂性。

假设我有这些数据类型:

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 只是一个从 Library 中提取 [Book] 的函数。

显然,只要 Ralph 不借书的副本,这个功能就可以了。然而,如果他这样做了,那么书籍列表中就会出现重复,这是不可取的。

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

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

【问题讨论】:

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

标签: haskell


【解决方案1】:

简单。

首先使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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2012-05-09
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多