错误:模糊类出现“Ord”

时间:2010-11-08 14:52:18

标签: haskell hugs

data (Ord a) => Stree a = Null 
| Fork (Stree a) a (Stree a)

mkStree :: (Ord a) => [a] -> Stree a
mkStree [] = Null
mkStree (x:xs) = Fork (mkStree smaller) x (mkStree larger)
               where (smaller,larger) = partition (<= x) xs                    
partition :: (a->Bool) -> [a] -> ([a],[a])
partition p xs = ([ x | x <- xs, p x],
                  [ y | y <- xs, (not . p) y])

我该如何解决这个问题 - &gt;模糊类出现“Ord” * 可以参考:Hugs.Prelude.Ord

2 个答案:

答案 0 :(得分:3)

我无法重现此错误,但我可以采取一些猜测。 “不明确的类出现”错误意味着范围中有多个“Ord”定义,因此真正的问题不在于您在此处包含的代码中。问题是您导入的其中一个模块由于某种原因重新定义了“Ord”,或者您在代码中重新定义它。无论哪种方式,唯一可行的方法是隐藏或限定其他定义(例如Prelude中的默认定义)。如果您尝试使用非标准Ord实现,则需要导入Prelude隐藏Ord:

import Prelude hiding(Ord)

如果您没有故意使用非标准Ord,那么您需要确定第二个来自哪里并删除或隐藏它。但是,在你的问题中,我没有足够的信息可以说明如何这样做。我希望错误消息也比你在这里列出的更长,因为它应该显示Ord的两个定义的位置。

答案 1 :(得分:1)

如果从数据声明中删除Ord上下文会怎样?

data Stree a = Null | Fork (Stree a) a (Stree a)

关于数据声明的类上下文非常不直观,我怀疑这可能会导致Hugs出错。

在任何情况下,都不应将上下文放在数据或newtype声明上。它们对某些GHC扩展很有用,但我认为Hugs不支持任何这些情况。