【问题标题】:Haskell: Possible fix: add (Eq a) to the context ofHaskell:可能的解决方法:将 (Eq a) 添加到
【发布时间】:2011-02-16 03:22:44
【问题描述】:

我是 Haskell 的新手,我很难理解我的代码有什么问题。

这是我应该做的:
考虑以下二叉树的定义

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

考虑一下函数reflect,它通过一路向下左右交换形成二叉树的镜像

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

写一个函数areMirrorImages,判断两棵二叉树t和u是否满足 t = 反映你。该函数不应构建新树,因此不应调用反射或节点;尽管它可能会在模式中使用 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 行收到以下错误:
无法从使用 '==' 所产生的上下文 () 中推导出 (Eq a)
可能的解决方法:将 (Eq a) 添加到“areMirrorImages”的类型签名的上下文中
在表达式中:x==y

我对为什么会收到此错误感到困惑,我尝试在网上寻找解决方案,但到目前为止我一无所获。谢谢。

【问题讨论】:

    标签: haskell tree compiler-errors typeclass


    【解决方案1】:

    目前,您的二叉树可以保存任何类型 - 甚至是无法使用 == 比较的类型。因此,如果您在包含此类类型的树上调用 areMirrorImages... 会发生什么?

    您需要做的是在areMirrorImages 函数上放置一个约束,使其只能接受可以比较其内容的二叉树。

    类似于以下内容:

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

    【讨论】:

    • 好吧,这是有道理的。非常感谢您帮助我理解这一点!
    【解决方案2】:

    顺便说一句:将函数的所有“匹配”情况放在顶部通常是个好主意,因为这通常会简化“不匹配”情况:

    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  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      相关资源
      最近更新 更多