2014-10-21 5 views
1

아래 코드에서 대수 데이터 형식을 정의하고이를 Show의 인스턴스로 지정하려고합니다. 그러나 컴파일 타임 오류가 발생합니다 (아래 포함). 내가 도대체 ​​뭘 잘못하고있는 겁니까?하스켈 : 표시의 인스턴스 만들기

저는 정확한 구문 (atherast per this post)을 사용하고 있다고 생각합니다. 컨텍스트를 들어, 나는 다음과 같은 컴파일 타임 오류를 받고 있어요 Problem #13 in '99 Haskell Problems'

data RepeatType a = Multiple (Int, a) | Single a 

instance Show RepeatType where 
    show (Multiple (n,x)) = "(" ++ n ++ " " ++ show x ++ ")" 
    show (Single x)  = show x 

을 일하고 : 그것이 작동하는 GHCi에서 다음과 같이

test.hs:3:15: 
    Expecting one more argument to `RepeatType' 
    In the instance declaration for `Show RepeatType' 
Failed, modules loaded: none. 

예를 들어, 목표는 다음과 같습니다

ghci> Multiple (5,'C') 
(5 C) 
ghci> Single 'D' 
D 

편집 : 완전히 관련없는 게시물 제목을 불쌍하게 생각합니다. - 지금 변경되었습니다.

답변

11

당신의 문제는 RepeatType 그 자체가 실제로 유형이 아니라는 점입니다. 유형 생성자입니다. Show은 "적절한"유형으로 만 인스턴스화 할 수 있습니다 (예 : RepeatType a. 그러나,이에 대한이 같은 끝낼 것이다 있도록, a 자체가 Show의 인스턴스가 될 것을 약속 할 필요가 작동합니다 :

instance (Show a) => Show (RepeatType a) where 
    show (Multiple (n,x)) = "(" ++ show n ++ " " ++ show x ++ ")" 
    show (Single x)  = show x 

(참고 : 당신은 또한에 nshow를 호출해야합니다 Ints와 Strings를 연결할 수 없으므로 정의의 첫 번째 부분입니다.)