2013-05-07 3 views
7

私は現在、型クラスの書き方を学んでいます。私はあいまいな出現のコンパイルエラーでOrd型クラスを書くように見えません。あいまい発生

module Practice where 

class (Eq a) => Ord a where 
    compare    :: a -> a -> Ordering 
    (<), (<=), (>=), (>) :: a -> a -> Bool 
    max, min    :: a -> a -> a 

    -- Minimal complete definition: 
    --  (<=) or compare 
    -- Using compare can be more efficient for complex types. 
    compare x y 
     | x == y = EQ 
     | x <= y = LT 
     | otherwise = GT 

    x <= y   = compare x y /= GT 
    x < y   = compare x y == LT 
    x >= y   = compare x y /= LT 
    x > y   = compare x y == GT 

    -- note that (min x y, max x y) = (x,y) or (y,x) 
    max x y 
     | x <= y = y 
     | otherwise = x 
    min x y 
     | x <= y = x 
     | otherwise = y 

エラーが

Practice.hs:26:14: 
    Ambiguous occurrence `<=' 
    It could refer to either `Practice.<=', defined at Practice.hs:5:10 
          or `Prelude.<=', 
          imported from `Prelude' at Practice.hs:1:8-15 
... 

などです。私はそれがPreludeの定義されたバージョンと衝突していると思う。

答えて

19

問題は、関数の名前がPreludeの標準的な名前と衝突していることです。あなたが競合する名前を隠し、明示的なimport宣言を追加することができ、これを解決するために

、:

module Practice where 

import Prelude hiding (Ord, compare, (<), (<=), (>=), (>), max, min) 

... 
+0

を起動することができます – user1850254

10

HAMMARが正しいと、それがあるため、標準のプレリュード名と衝突のです。しかし、プレリュードの名前に加えて、別の解決策があります。hidingあなたは資格のプレリュードインポートすることができ

maxは、ご使用のバージョンを実行し、P.maxは標準プレリュードのを実行します:

module Practice where 

import qualified Prelude as P 

... 

次に、あなたはあなたと関数の標準バージョンの両方へのアクセスを得ることができます。

GHCの拡張機能NoImplicitPrelude(http://www.haskell.org/haskellwiki/No_import_of_Prelude)は、すべての標準的なプレリュード機能を完全に隠す方法もあります。それは私の問題を解決しThanks.Thatファイルの一番最初の書き込み

{-# LANGUAGE NoImplicitPrelude #-} 

関連する問題