我尝试进行培训,创建与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)
这意味着什么?
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.