我試圖爲Huffman樹數據結構實現Eq
和Ord
,但我得到了幾個「模糊定義」和範圍相關的錯誤。我一直在下面的https://www.haskell.org/tutorial/classes.html嘗試爲自定義樹數據結構定義Eq時出現模糊的定義錯誤
import Data.List
data Tree a = Leaf a Int | Internal (Tree a) (Tree a) Int deriving (Eq, Ord)
instance (Eq a) => Eq (Tree a) where
(Leaf a ac) == (Leaf b bc) = (a == b) && (ac == bc)
(Internal (Tree a1) (Tree a2) ac) == (Internal (Tree b1) (Tree b2) bc) =
(a1 == b1) && (a2 == b2) && (ac == bc)
_ == _ = False
instance Ord (Tree a) where
Tree a <= Tree b = (freq a) <= (freq b)
freq :: Tree a -> Int
freq (Leaf _ c) = c
freq (Internal _ _ c) = c
樹例子,我不知道什麼是不明確的。它表示==
可能來自Prelude
或我的代碼。但是,我的==只是爲我的Tree
定義的,所以我不確定發生了什麼。請幫我理解並糾正這個問題。
您正在爲'Tree'派生'Eq'和'Ord'。那你爲什麼要寫它的實例? – Sibi
除了bheklir所說的你使用Tree進行模式匹配之外,Tree是一個類型構造函數而不是Data構造函數。你只能使用數據構造函數模式匹配葉或內部 – felipez
@Sibi我可能會誤解某些東西,但我的理解是Eq和Ord是接口,並且我提供了Eq和Ord的具體實現。我來自Java背景。 – ssh