显示实例奇怪的行为

时间:2013-09-05 14:17:02

标签: haskell

我尝试进行培训,创建与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)

这意味着什么?

1 个答案:

答案 0 :(得分:5)

可以为任何类型派生

Show,但是如果要使用派生版本,则必须让编译器知道。

为了使您的定义show (Tree a [v]) = show a有效,a必须是Show的实例。它可以是派生实例,也可以是自定义实例。所以我们只需告诉编译器aShow的实例,就像这样。

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也是如此。