2016-04-20 2 views
1

Привет StackOverflow сообщества, еще довольно элементарный вопрос от моего имени:Haskell - удаление повторяющихся элементов из списка ADT в ADT

Был задан вопрос около пяти лет назад, который спросил: «удаление повторяющихся элементов из списка в 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 просто функция, которая извлекает [книга] из библиотеки.

Очевидно, что эта функция прекрасна до тех пор, пока Ральф не заимствует дубликаты книг. Тем не менее, если он это сделает, то в списке книг будет дубликат, что нежелательно.

Как мне написать функцию, которая возвращает текущую [книгу], однако также удаляет любые дубликаты? Я попробовал метод в вопросе, упомянутом выше в начале сообщения, однако компилятор жалуется, что он специально хочет [Book] not [a].

Ссылка на предыдущий вопрос: Removing repeated elements from a list in Haskell

+1

Как насчет использования 'nub :: Eq a => [a] -> [a]'? Обратите внимание, что вам необходимо предоставить (или получить) экземпляр «Eq». – Zeta

ответ

2

Easy.

Сначала сделайте 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 
Смежные вопросы