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」の定義が複数あることを意味します。したがって、実際の問題は、ここに含めたコードにはありません。問題は、インポートしているモジュールの1つが何らかの理由で「Ord」を再定義しているか、コードで再定義していることです。いずれにせよ、機能する唯一の方法は、他の定義(プレリュードのデフォルトの定義など)が非表示または修飾されている場合です。非標準のOrd実装を使用しようとしている場合は、Ordを非表示にするプレリュードをインポートする必要があります。

import Prelude hiding(Ord)

非標準のOrdを意図的に使用していない場合は、2番目の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 に答える