在BST Haskell中查找元素

在BST Haskell中查找元素,haskell,Haskell,我自己在BST中重写对元素函数的搜索,但是我遇到了这个错误,我不确定它的意思(错误发生在x(Empty)=False的行上) 以下是我的想法: data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show, Read, Eq) searchTree :: (Ord a) => a -> Tree a -> Bool searchTree x (Empty) = False

我自己在BST中重写对元素函数的搜索,但是我遇到了这个错误,我不确定它的意思(错误发生在x(Empty)=False的行上)

以下是我的想法:

data Tree a = Empty | Node a (Tree a) (Tree a)
                    deriving (Show, Read, Eq)


searchTree :: (Ord a) => a -> Tree a -> Bool
searchTree x (Empty) = False
searchTree x (Node left y right)
    |y == x = True
    |y > x = searchTree x left
    |y < x = searchTree x right
数据树a=空|节点a(树a)(树a)
导出(显示、读取、均衡)
搜索树::(Ord a)=>a->a->Bool
searchTree x(空)=False
搜索树x(节点左y右)
|y==x=True
|y>x=左搜索树x
|y
您有
节点a(树a)(树a)
,但模式匹配为
(节点左y右)
。这推断出以下类型:
left::a;y、 右::树a
。然后将
y::Tree a
x::a
进行比较,迫使它们具有相同的类型,这只有在
Tree a
a
的类型相同时才可能。这是一种不可能的无限类型,所以GHC抱怨道

解决方案是修复模式匹配:它应该是
(Node y left right)
,以匹配数据构造函数

这是一种理论上可能的类型,只是不是一种非常有用的类型
a~树a
可以保存,但前提是
a~树(树(树(树…))

您拥有
节点a(树a)(树a)
,但模式匹配为
(节点左y右)
。这推断出以下类型:
left::a;y、 右::树a
。然后将
y::Tree a
x::a
进行比较,迫使它们具有相同的类型,这只有在
Tree a
a
的类型相同时才可能。这是一种不可能的无限类型,所以GHC抱怨道

解决方案是修复模式匹配:它应该是
(Node y left right)
,以匹配数据构造函数


这是一种理论上可能的类型,只是不是一种非常有用的类型
a~树a
可以保存,但前提是
a~树(Tree(Tree)(Tree(Tree)(Tree…)

您的代码确实给了我一个错误(因为
left
y
应该在第二个等式的模式中交换),但不是您描述的那个……是的,我尝试了,错误消失了。为什么不能是“left y right”?你的代码确实给了我一个错误(因为
left
y
应该按照第二个等式的模式进行交换),但不是你描述的那个……是的,我试过了,错误消失了。为什么不能是“左y右”?我认为GHC处理无限类型的方式最近有一些变化。但这其实并不重要:并不要求每个编译器都为错误的代码提供相同的错误消息。我只是好奇为什么我们会得到不同的错误信息。难道大多数(所有?)类型理论都没有无限类型的概念,就像它们没有无限项的概念一样吗?我认为GHC对待无限类型的方式最近有一些变化。但这其实并不重要:并不要求每个编译器都为错误的代码提供相同的错误消息。我只是好奇为什么我们会得到不同的错误信息。大多数(所有?)类型理论不都缺少无限类型的概念吗,就像它们缺少无限项的概念一样?
data Tree a = Empty | Node a (Tree a) (Tree a)
                    deriving (Show, Read, Eq)


searchTree :: (Ord a) => a -> Tree a -> Bool
searchTree x (Empty) = False
searchTree x (Node left y right)
    |y == x = True
    |y > x = searchTree x left
    |y < x = searchTree x right