2016-04-20 8 views
1

こんにちはStackOverflowのコミュニティでADTリストから繰り返しの要素を取り除く、私に代わって別のかなり基本質問:質問は、いくつかの5年前に尋ねていた ハスケル - ADT

いる尋ねた「リストの中から繰り返し要素を取り除きますハスケル。私は尋ねるのに似た何かを持っています。ある程度の合併症があります。

は、私はこれらのデータ型を持っていると言う:

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は、単にライブラリから[ブック]を取り出す関数です。

明らかに、この関数は、Ralphが書籍の重複を借りない限り、問題ありません。それにもかかわらず、そうするならば、書籍のリストには重複があり、それは望ましくない。

現在の[書籍]を返す関数を書くにはどうすればよいですか?ただし、重複は削除されますか?私はポストの冒頭で述べた問題の方法を試しましたが、コンパイラはそれが特に[書籍]ではなく[a]であると訴えています。前の質問へ

リンク: Removing repeated elements from a list in Haskell

+1

'nub :: Eq a => [a] - > [a]'の使い方はどうですか? 'Eq'インスタンスを提供(または派生)する必要があることに注意してください。 – Zeta

答えて

2

簡単。

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

data Book = Book {title :: String, barcode :: Integer} deriving Eq 

は次に(elem関数を使用して)ライブラリに既にある本をフィルタリングする機能addBookを修正:

まずBookEqのインスタンスを作ります関数は次のシグネチャを持ちます。

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