2013-05-07 24 views
7

Attualmente sto imparando a scrivere classi di tipi. Non riesco a scrivere la classe di tipo Ord con errori di compilazione di eventi ambigui.Occorrenza ambigua

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 

Gli errori sono

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 
... 

e così via. Penso che sia in contrasto con la versione definita Preludio.

risposta

19

Il problema è che i nomi delle funzioni si scontrano con quelli standard del Preludio.

Per risolvere questo problema, è possibile aggiungere una dichiarazione di importazione esplicita che nasconde i nomi in conflitto:

module Practice where 

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

... 
+0

Thanks.That risolto il mio problema – user1850254

10

Hammar è giusto, è a causa di scontrarsi con i nomi Prelude standard. Ma ci sono altre soluzioni oltre ai nomi hiding di Prelude.

È possibile importare Prelude qualificata:

module Practice where 

import qualified Prelude as P 

... 

successivo, è possibile ottenere l'accesso a voi e versione standard della funzione: max eseguirà la propria versione, e P.max eseguirà standard di Preludio di.

C'è anche un modo per nascondere completamente tutte le funzioni di Preludio standard: l'estensione di GHC NoImplicitPrelude (http://www.haskell.org/haskellwiki/No_import_of_Prelude). Può essere attivato scrittura

{-# LANGUAGE NoImplicitPrelude #-} 

in fin dall'inizio del file