我尝试进行培训,创建与Data.Tree相同的数据结构:
data MyTree a = Tree a [MyTree a]
但是当我尝试为这个数据结构创建show instance时遇到了麻烦:
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'
对我来说有点奇怪。我可以一眼看出函数 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)
这意味着什么?
答案 0 :(得分: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)
等声明说“只要a
是Eq
的实例,Tree a
也是如此。