为自定义Tree类型实现Show实例时遇类型约束错误求助
解决自定义Tree类型Show实例的类型错误
你遇到的这个错误根源在于,你定义的Show (Tree a)实例没有给类型变量a加上Show约束——毕竟不是所有Haskell类型都支持show操作,编译器需要明确知道a本身是可以被展示的,才能在Leaf a和Branch的子节点上调用show方法。
咱们来看修正后的完整代码:
data Tree a = Leaf a | Branch (Tree a) (Tree a) instance Show a => Show (Tree a) where show (Branch a b) = "<" ++ show a ++ "," ++ show b ++ ">" show (Leaf a) = show a
关键改动说明:
- 在
instance声明开头加上了Show a =>,这就给编译器明确了约束:只有当a本身实现了Show类型类时,Tree a才能拥有Show实例。 - 顺便帮你去掉了
Branch定义里多余的show $——原来的写法会把拼接好的字符串再额外用show包裹一遍,导致输出多一层引号(比如会变成"<Leaf 1,Leaf 2>"而不是预期的<Leaf 1,Leaf 2>),这应该不是你想要的效果。
你可以测试一下这段代码:
main = print $ Branch (Leaf 1) (Leaf 2) -- 输出结果:<1,2>
这样就能正常编译运行啦!
内容的提问来源于stack exchange,提问作者user304290
相关产品推荐
相关产品推荐

