12

現在、型クラスの書き方を学んでいます。あいまいなコンパイルエラーが発生した 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 で定義されたバージョンと衝突していると思います。

4

2 に答える 2

28

問題は、関数の名前が Prelude の標準的な名前と衝突していることです。

これを解決するには、競合する名前を隠す明示的なインポート宣言を追加できます。

module Practice where

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

...
于 2013-05-07T23:19:28.863 に答える
19

hammar そうです、それは標準的な Prelude 名と衝突するためです。hidingしかし、Prelude からの名前に加えて、別の解決策があります。

Prelude 認定をインポートできます。

module Practice where

import qualified Prelude as P

...

次に、あなたと関数の標準バージョンの両方にアクセスできます:maxあなたのバージョンをP.max実行し、標準の Prelude を実行します。

また、すべての標準 Prelude 関数を完全に非表示にする方法もあります: GHC の拡張機能 NoImplicitPrelude ( http://www.haskell.org/haskellwiki/No_import_of_Prelude )。書き込み可能

{-# LANGUAGE NoImplicitPrelude #-}

ファイルの最初に

于 2013-05-07T23:34:35.973 に答える