2017-05-05 1 views
2

내가 유형 Foo이 내가 GHCi에서 사용할 수 있도록, 그것을 Show의 인스턴스를 만들고 싶어 : 나는 그것을 사용하려고하면인스턴스를 정의 할 때 모호한 오류가 발생하는 이유는 무엇입니까?

data Foo = Foo 

instance Show Foo where 
show Foo = "Foo" 

을하지만, 나는 모호한 발생 오류 :

ghci> show Foo 
<interactive>:4:1: 
    Ambiguous occurrence `show' 
    It could refer to either `Main.show', defined at Foo.hs:4:1 
          or `Prelude.show', 
          imported from `Prelude' at Foo.hs:1:1 
          (and originally defined in `GHC.Show') 

왜? 방금 typeclass에 속하는 함수를 정의 했지?

+0

참고 :이 질문은 [내 다른 하나와 유사] (https://stackoverflow.com/questions/35855170/why-shouldnt-i-mix-tabs-and-spaces)이며 최소 일반 사항입니다. 더 자주 묻는 하스켈 질문 중 하나의 변종. – Zeta

답변

4

TL : 인스턴스 바인딩을 들여 씁니다.


경고를 활성화하고 당신은 당신이 동일한 이름을 가진 인스턴스 작동show하지만, 대신 새로운 기능을 구현하지 않았 음을 알 수 있습니다 :

Foo.hs:3:10: Warning: 
    No explicit implementation for 
     either `showsPrec' or `Prelude.show' 
    In the instance declaration for `Show Foo' 

따라서 지금이 거기를 show s. Main.show (방금 실수로 정의한 파일)과 Prelude.show (사용하려는 클래스 별 파일)입니다.

우리는 (우리는 완벽하게 자신의 이름을 수식 할 필요가 있지만) 자신의 유형을보고을 확인 할 수 있습니다

당신의 where 바인딩 당신이 평소에 들여 쓰기 것처럼, 들여 쓰기 할 필요가 있기 때문이다
ghci> :t Main.show 
Main.show :: Foo -> [Char] 
ghci> :t Prelude.show 
Prelude.show :: Show a => a -> String 

기능. 심지어 하나의 공간으로도 충분합니다 :

하스켈은 공백을 사용하여 블록을 구분합니다. where은 언제 다르게 중단됩니까?

관련 문제