我自己在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
答案 0 :(得分:4)
您有Node a (Tree a) (Tree a)
,但模式匹配为(Node left y right)
。这推断出以下类型:left :: a; y, right :: Tree a
。然后,您将y :: Tree a
与x :: a
进行比较,这会强制它们具有相同的类型,这只有在Tree a
与a
的类型相同时才有可能。这是一个不可能的 1 ,无限类型,所以GHC抱怨。
解决方案是修复模式匹配:它应该是(Node y left right)
,以匹配数据构造函数。
1 这是一种理论上可行的类型,只是一种非常有用的类型。 a ~ Tree a
可以保留,但仅限于a ~ Tree (Tree (Tree (Tree (Tree ...))))
。