我目前正在进行一项任务,我必须在Haskell中创建一个二叉树。
我们必须使用以下数据类型定义:
data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq,Ord,Show)
值为Nil的树是空(有序)树,非空树由值和两个子树组成。
我必须编写一个函数“isOrderedTree”,它对有序树返回True,对无序树返回False。
该功能的定义如下:
isOrderedTree :: Ord a => Tree a -> Bool
isOrderedTree Nil = True
isOrderedTree (Node x Nil Nil) = True
isOrderedTree (Node x (Node y a b) Nil) = x > y && isOrderedTree (Node y a b) && x > getMax (getValues (Node y a b))
isOrderedTree (Node x Nil (Node y a b)) = y > x && isOrderedTree (Node y a b) && x < getMin (getValues (Node y a b))
isOrderedTree (Node x (Node y a b) (Node z c d)) = x > y && x < z && isOrderedTree (Node y a b) && isOrderedTree (Node z c d) && x > getMax (getValues (Node y a b)) && x < getMin (getValues (Node z c d))
我的问题是以下函数调用不起作用:
isOrderedTree Nil
我收到以下错误消息:
Ambiguous type variable ‘a0’ arising from a use of ‘isOrderedTree’ prevents the constraint ‘(Ord a0)’ from being solved.
Probable fix: use a type annotation to specify what ‘a0’ should be.
These potential instances exist:
instance (Ord a, Ord b) => Ord (Either a b)
instance Ord Ordering
instance Ord Integer
有人知道我在这里缺少什么吗?
答案 0 :(得分:1)
您需要为Nil
提供具体类型,即使特定类型并不重要。
-- All of the following should return True
isOrderedTree (Nil :: Tree ())
isOrderedTree (Nil :: Tree Integer)
isOrderedTree (Nil :: Tree Char)
-- etc