Haskell:可能的修复:将(Eq a)添加到上下文中

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)


Lan*_*dei 5

正如一点注意事项:将函数的所有"匹配"情况放在顶部通常是个好主意,因为这通常简化了"不匹配"的情况:

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)