2012-12-16 60 views
2

我實現在Haskell的合併 - 查找數據結構。參數化類型和平等哈斯克爾

我想用參數化的類型,但我面臨的一個小問題,當我試圖比較我作爲參數使用的對象。

data UnionFindElement valueType = 
    RootElement valueType | 
    ElementWithParent valueType (UnionFindElement valueType) 

holds :: UnionFindElement valueType -> valueType -> Bool 
holds (RootElement v) value = v == value 

似乎沒有定義相等性。

No instance for (Eq valueType) 
    arising from a use of `==' 
In the expression: v == value 

我該如何限制valueType只考慮具有定義的等式關係的類型?

回答

4

holds :: (Eq valueType) => UnionFindElement valueType -> valueType -> Bool

(Eq valueType) =>裝置valueType是從Eq(equatable值)類,並且所述構建體中存在精確地能夠限制類型的通用參數。

請注意,這也適用於數據聲明和其他幾個地方。您可以瞭解更多關於http://en.wikibooks.org/wiki/Haskell/Classes_and_types#Type_constraints

對於一個更一般的概述,http://en.wikipedia.org/wiki/Type_classhttp://en.wikipedia.org/wiki/Ad-hoc_polymorphism

+0

感謝您的回答和鏈接! – mariosangiorgio

+1

我增加了兩個,你似乎喜歡鏈接:) –

+2

正如文章指出,限制對數據聲明(即'數據(公式一)=>一個A = A了')並不如預期,並已被棄用工作。 – huon

3

要添加到弗拉季的出色答卷,當面對這樣一個問題,我不知道一個類型的,我經常省略鍵入並利用Haskell的類型推斷功能,將代碼加載到GHCi中(並且順從地),讓Haskell告訴我它推斷出的是什麼。也就是說,把這個代碼,而這正是除了沒有明確的類型holds你的一樣,成GHCI:

data UnionFindElement valueType = 
    RootElement valueType | 
    ElementWithParent valueType (UnionFindElement valueType) 

holds (RootElement v) value = v == value 

並檢查類型:

ghci> :t holds 
holds :: Eq a => UnionFindElement a -> a -> Bool 

其中,比阿爾法替代其他,這正是弗拉季斯拉夫所給的。

+0

謝謝,這是一個非常酷的伎倆 – mariosangiorgio