2013-05-07 7 views
7

Ich lerne gerade, wie man Typklassen schreibt. Ich kann nicht scheinen, die Ord-Klasse mit Kompilierungsfehlern mehrdeutigen Auftretens zu schreiben.Mehrdeutiges Vorkommen

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 

Fehler sind

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

und so weiter. Ich denke, es kollidiert mit der vom Prelude definierten Version.

Antwort

19

Das Problem ist, dass die Namen Ihrer Funktionen mit den Standardfunktionen des Prelude kollidieren.

Um dies zu lösen, können Sie eine explizite Einfuhrerklärung hinzufügen, die die widerstreitenden Namen verbirgt:

module Practice where 

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

... 
+0

aktiviert Thanks.That mein Problem gelöst – user1850254

10

hammar richtig ist, es mit Standard-Prelude Namen wegen clashing ist. Aber es gibt andere Lösungen neben hiding Namen von Prelude.

Sie Prelude importieren qualifiziert:

module Practice where 

import qualified Prelude as P 

... 

Als Nächstes können Sie sowohl Zugang zu Ihnen und Standard-Version Funktion gewinnen: max Ihre Version ausgeführt wird, und P.max wird Standard Prelude execute.

Es gibt auch eine Möglichkeit, alle Standard-Prelude-Funktionen vollständig zu verbergen: GHC's Erweiterung NoImplicitPrelude (http://www.haskell.org/haskellwiki/No_import_of_Prelude). Es kann sein Schreiben

{-# LANGUAGE NoImplicitPrelude #-} 

in ganz am Anfang der Datei