Haskell如何为代数数据类型的类型参数指定Show类型类约束
问题原因
你当前的Show实例声明没有对类型参数a添加约束,但实现代码中调用了show方法输出节点存储的a类型值,该方法要求入参类型必须实现Show类型类,因此编译器抛出找不到Show a实例的错误。
解决方法
在实例声明的头部添加Show a约束,指定只有当存储的元素类型a实现了Show类型类时,BinaryTree a才会实现Show类型类,修改后的完整代码如下:
instance Show a => Show (BinaryTree a) where show Leaf = "x" show (Node node left right) = show node ++ "\n" ++ show left ++ " " ++ show right
如果你的GHC版本较新,上述写法可以直接运行;如果遇到上下文相关的编译警告,开启FlexibleContexts扩展即可,这也是Haskell中为带参数的类型实现类型类时添加参数约束的标准写法。
内容的提问来源于stack exchange,提问作者vijaicv
相关产品推荐
相关产品推荐

