2011-11-04 100 views
2

大家好,我試圖找出如何在Haskell的一組數據類型,但我不知道這一點,這是我到目前爲止,我有點糊塗哈斯克爾組數據類型

data Set a = Node a | List { 
    list :: [a] 
}deriving(Eq,Show,Ord) 

insert :: Set Integer -> Set Integer -> Bool 
insert (Node itemToInsert) (List list) 
    |contains (List list) (Node itemToInsert) == False = List(list:(Node itemToInsert)) 


contains :: Set Integer -> Set Integer -> Bool 
contains (List []) (Node numberToFind) = False 
contains (List (x:xs)) (Node numberToFind) 
    |x == (Node numberToFind) = True 
    |otherwise = contains (List (xs)) (Node numberToFind) 

感謝您的幫助!

+0

問題是...? –

+0

我想要一個節點列表,我不知道如何定義數據類型來做到這一點。 – functionalCode

+1

你不能指定「這是一個特定構造函數的列表」:使用類似的智能構造函數,或使用其他數據類型。但是,當我們有Data.Set時,爲什麼要嘗試定義一個新的Set數據類型?如果你想表示一個圖(由「節點」暗示),那麼可以這麼說,或者使用現有的圖庫! – ivanm

回答

7

從你的代碼看來,你已經明白,一個集合可以被看作一個沒有重複的列表。因此,讓我們在一個簡單的類型定義表達這樣的:

data Set a = Set [a] 

爲了確保有沒有重複,一個可以引入「智能建設者」,這是不是技術上的構造函數,但使用因此。

empty :: Set a 
empty = Set [] 

我們需要另一個創建非空集。讓我們來看看你的insert函數。爲什麼它會返回Bool?它不應該返回一組?爲什麼insert期望兩套?因此,要插入一個整數到整數集一個你可以使用以下類型簽名:

insert :: Integer -> Set Integer -> Set Integer 

實施包括兩種情況:1,給定整數不是在給定的,且2.給定整數在給定的集合中。

insert x (Set xs) 
    | not (x `elem` xs) = Set (x:xs) 
    | otherwise   = Set xs 

因爲,這個問題似乎是家庭作業的一部分。我想說你應該試着弄清楚如何自己實現elem