2013-09-05 111 views
1

我試試,培訓,創建數據結構一樣Data.Tree:顯示實例奇怪的行爲

data MyTree a = Tree a [MyTree a] 

但是我有一個麻煩,當我試圖爲這種數據結構創建顯示實例:

instance Show (MyTree a) where 
    show (Tree a [v]) = show a -- Only first element 

我得到一個錯誤

No instance for (Show a) 
arising from a use of `show' 

這是一些奇怪的我。因爲我可以瀏覽功能顯示可以使用任何類型。

而第二個問題:在standart library使用獲得方法,但也有一些奇怪的 defenitions:

instance Eq a => Eq (Tree a) 
instance Read a => Read (Tree a) 
instance Show a => Show (Tree a) 
instance Data a => Data (Tree a) 

是什麼,這些手段?

+2

還有另一種可能的漏洞潛伏在這種情況下:模式'[V]'只有匹配一個元素列表,所以'Tree a [v]'將無法匹配,例如'Tree 0 []'和'Tree 2 [Tree 1 [],Tree 0 []]'只需使用'v'以匹配任何東西(它只是一個變量);如果你不關心該值,則爲'_'('_'是一個通配符 - 它像變量一樣匹配,但不能在以後引用)。 –

回答

5

Show可以爲任何類型派生,但如果要使用派生版本,則必須讓編譯器知道。

爲了使您的定義show (Tree a [v]) = show a能夠正常工作,a必須是Show的實例。它可以是派生實例或自定義實例。所以我們只需要告訴編譯器a就是這樣的一個Show的實例。

instance (Show a) => Show (MyTree a) where 
    show (Tree a [v]) = show a -- Only first element 

的聲明,如instance Eq a => Eq (Tree a)說:「只要aEq一個實例,因此是Tree a