0
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])

我怎样才能解决这个故障 --> 模棱两可的类出现“Ord” *可以参考:Hugs.Prelude.Ord

4

2 回答 2

3

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

import Prelude hiding(Ord)

如果您不是故意使用非标准 Ord,那么您需要弄清楚第二个 Ord 的来源并移除或隐藏它。不过,您的问题中没有足够的信息让我能够说出该怎么做。我希望错误消息也比您在此处列出的要长,因为它应该显示 Ord 的两个定义的位置。

于 2010-11-08T15:41:53.797 回答
1

如果从数据声明中删除 Ord 上下文会发生什么?

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

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

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

于 2010-11-08T16:17:57.590 回答