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의 표준 이름과 충돌한다는 것입니다. 이 문제를 해결하려면

, 당신은 충돌하는 이름을 숨 깁니다 명시 적으로 수입 신고를 추가 할 수 있습니다

module Practice where 

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

... 
+0

의 맨 처음에 쓰기

{-# LANGUAGE NoImplicitPrelude #-} 

활성화 할 수 있습니다 – user1850254

10

HAMMAR 잘, 그것 때문에 표준 서곡 이름으로 충돌의입니다. 그러나 Prelude의 이름 외에 hiding의 다른 솔루션이 있습니다. 당신은 자격을 갖춘 서곡 가져올 수 있습니다

: max이 버전을 실행하며, P.max 표준 서곡의를 실행합니다 :

module Practice where 

import qualified Prelude as P 

... 

다음으로, 당신은 당신과 기능의 표준 버전 모두에 액세스 할 수 있습니다.

GHC의 확장 기능 NoImplicitPrelude (http://www.haskell.org/haskellwiki/No_import_of_Prelude)는 모든 표준 Prelude 기능을 완전히 숨기는 방법입니다. 그것은 내 문제를 해결 고맙습니다 저 파일