【发布时间】:2013-05-31 10:22:09
【问题描述】:
出于教育目的,我在 Haskell 中玩树。我有这样定义的Tree a 类型
data Tree a = EmptyTree | Node a (Tree a) (Tree a)
还有许多共享基本约束的函数 - Ord a - 所以它们有类似的类型
treeInsert :: Ord a => a -> Tree a -> Tree a
treeMake :: Ord a => [a] -> Tree a
等等。我也可以这样定义Tree a
data Ord a => Tree a = EmptyTree | Node a (Tree a) (Tree a)
但我不能简化我的功能并省略额外的Ord a 如下:
treeInsert :: a -> Tree a -> Tree a
treeMake :: [a] -> Tree a
为什么 Haskell(以-XDatatypeContexts 运行)不会自动推断出这个约束?对我来说,这似乎很明显。为什么我错了?
这是一些示例源代码
data (Eq a, Ord a) => Tree a = EmptyTree | Node a (Tree a) (Tree a)
treeInsert :: a -> Tree a -> Tree a
treeInsert a EmptyTree = Node a EmptyTree EmptyTree
treeInsert a node@(Node v left right)
| a == v = node
| a > v = Node v left (treeInsert a right)
| a < v = Node v (treeInsert a left) right
mkTree :: [a] -> Tree a
mkTree [] = EmptyTree
mkTree (x:xs) = treeInsert x (mkTree xs)
我收到了
Tree.hs:5:26:
No instance for (Ord a)
arising from a use of `Node'
In the expression: Node a EmptyTree EmptyTree
In an equation for `treeInsert':
treeInsert a EmptyTree = Node a EmptyTree EmptyTree
Failed, modules loaded: none.
【问题讨论】:
-
在上下文中不需要
Eq和Ord。Eq是Ord的超类,所以后者就足够了。
标签: haskell types type-deduction