Gus*_*Gus 6 tree haskell compiler-errors typeclass
我是Haskell的新手,我很难理解我的代码在这里出了什么问题.
这是我应该做的:
考虑以下二叉树的定义
data BinaryTree a = Empty | Node a (BinaryTree a) (BinaryTree a)
Run Code Online (Sandbox Code Playgroud)
考虑通过向左和向下交换形成二叉树的镜像的函数reflect
reflect :: BinaryTree a -> BinaryTree a
reflect Empty = Empty
reflect (Node x l r) = Node x (reflect r) (reflect l)
Run Code Online (Sandbox Code Playgroud)
编写一个函数areMirrorImages,它确定两个二叉树t和u是否满足t = reflect u.该函数不应构建新树,因此不应调用reflect或Node; 虽然它可能在模式中使用Node.
这是我写的:
areMirrorImages :: BinaryTree a -> BinaryTree a -> Bool
areMirrorImages Empty Empty = True
areMirrorImages (Node _ _ _) Empty = False
areMirrorImages Empty (Node _ _ _) = False
areMirrorImages (Node x l r) (Node y ll rr)
| x==y = ((areMirrorImages l rr) && (areMirrorImages r ll))
| otherwise = False
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时,我在第49行得到以下错误:
无法从使用'=='引起的context()中推断出(Eq a)
可能的修复:将(Eq a)添加到类型签名的上下文中for'areMirrorImages'
在表达式中:x == y
我很困惑为什么我收到这个错误,我尝试在线寻找解决方案,但到目前为止我没有找到任何结果.谢谢.
Ano*_*on. 15
目前,您的二叉树可以保存任何类型 - 甚至是无法使用的类型==
.所以,如果你打电话areMirrorImages
给一个包含这种类型的树......会发生什么?
你需要做的是对函数设置一个约束areMirrorImages
,这样它只能接受它可以比较内容的二叉树.
类似于以下内容:
areMirrorImages :: Eq a => BinaryTree a -> BinaryTree a -> Bool
Run Code Online (Sandbox Code Playgroud)
正如一点注意事项:将函数的所有"匹配"情况放在顶部通常是个好主意,因为这通常简化了"不匹配"的情况:
areMirrorImages :: Eq a => BinaryTree a -> BinaryTree a -> Bool
areMirrorImages Empty Empty = True
areMirrorImages (Node x l r) (Node y ll rr) =
and [x==y, areMirrorImages l rr, areMirrorImages r ll]
areMirrorImages _ _ = False
Run Code Online (Sandbox Code Playgroud)