显示实例奇怪的行为

Ser*_*nin 1 haskell

我尝试进行培训,创建与Data.Tree相同的数据结构:

data MyTree a = Tree a [MyTree a] 
Run Code Online (Sandbox Code Playgroud)

但是当我尝试为这个数据结构创建show instance时遇到了麻烦:

instance Show (MyTree a) where
  show (Tree a [v]) = show a -- Only first element
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

No instance for (Show a)
arising from a use of `show'
Run Code Online (Sandbox Code Playgroud)

这对我来说有些奇怪.因为我能看一眼功能能够适用于任何类型.

第二个问题:在标准库中使用了派生方法,但有一些奇怪的定义:

instance Eq a => Eq (Tree a)
instance Read a => Read (Tree a)
instance Show a => Show (Tree a)
instance Data a => Data (Tree a)
Run Code Online (Sandbox Code Playgroud)

这意味着什么?

mhw*_*bat 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
Run Code Online (Sandbox Code Playgroud)

声明如instance Eq a => Eq (Tree a)"只要a是一个实例Eq,也是如此Tree a.