2011-02-16 38 views
6

的上下文我对Haskell很陌生,我很难理解我的代码在这里出了什么问题。Haskell:可能的修复:添加(Eq a)到

这里是我应该做的事:
考虑一个二叉树

data BinaryTree a = Empty | Node a (BinaryTree a) (BinaryTree a) 

的定义如下考虑函数反映,通过形成一个二叉树的镜像全部左右交换

reflect :: BinaryTree a -> BinaryTree a 
reflect Empty = Empty 
reflect (Node x l r) = Node x (reflect r) (reflect l) 

编写一个函数areMirrorImages,确定两个二叉树t和u是否满足 t =反映u。该函数不应该建立新的树,所以它不应该调用reflect或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 

当我尝试运行它,我得到的线49以下错误:
无法推断(公式一)从上下文()从使用的“==”
可能的修复而产生:添加(式a)至类型签名的关于“areMirrorImages”
在表达式的上下文:X ==ý

我我很困惑,为什么我得到这个错误,我试着在网上找到解决方案,但到目前为止我没有发现任何东西。谢谢。

回答

15

目前,您的二叉树可以容纳任何类型 - 即使是使用==也无法比较的类型。所以如果你在包含这种类型的树上调用areMirrorImages ......应该发生什么?

你需要做的是在areMirrorImages函数上放置一个约束,这样它就只能接受它可以比较内容的二叉树了。

类似以下内容:

areMirrorImages :: Eq a => BinaryTree a -> BinaryTree a -> Bool 
+0

好吧,这是有道理的。非常感谢帮助我理解! – Gus 2011-02-16 03:56:40

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 
相关问题