在BST Haskell中查找元素

时间:2015-06-03 22:45:27

标签: haskell

我自己在BST中重写了一个元素搜索函数,但是我遇到了这个错误,我不确定它是什么意思(错误发生在x行(空)=假)

 Occurs check: cannot construct the infinite type: a = Tree a
 When generalising the type(s) for `searchTree'

以下是我提出的建议:

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

1 个答案:

答案 0 :(得分:4)

您有Node a (Tree a) (Tree a),但模式匹配为(Node left y right)。这推断出以下类型:left :: a; y, right :: Tree a。然后,您将y :: Tree ax :: a进行比较,这会强制它们具有相同的类型,这只有在Tree aa的类型相同时才有可能。这是一个不可能的 1 ,无限类型,所以GHC抱怨。

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

1 这是一种理论上可行的类型,只是一种非常有用的类型。 a ~ Tree a可以保留,但仅限于a ~ Tree (Tree (Tree (Tree (Tree ...))))