2010-04-21 4 views
2

하스켈에게 멍청한 멍청한 질문이 올거예요. 내가 ghci 출력 작업을하고 인스턴스 선언에 붙어있어 노력하고있어. 나는이 같은 선언을 만들기 위해 노력했습니다하스켈 인스턴스 선언 만들기

data Cmd = LD Int 
     | ADD 
     | MULT 
     | DUP 
     deriving Show 

type Prog = [Cmd] 

type Stack = [Int] 

type D = Stack -> Stack 

:

instance Show D where show = Stack 

을하지만, 내 모든 시도가 주어진 - 어떻게 "(> 스택) 쇼 (스택)"에 대한 인스턴스를 선언 할 수 불법적 인 인스턴스 선언이 발생했습니다. 어떤 도움이나 참고 사항이 많이 감사합니다!

+1

코드에서 사용자가 원하는 것이 분명하지 않습니다. 'show (\ s -> 1 : s)'를 반환합니다. – sepp2k

+1

나는 당신이 정말로 원하는 것 (그것이 무엇을 할 수 있는지 상상하기 힘들다)이 아니기 때문에 Show for D의 인스턴스를 정의하려고하지 않는 직감을 가지고있다. 그러나 컴파일러가 당신에게 유형이 있기 때문에 하나가 필요하다고 말하기 때문에 오류 어딘가에; 그게 가능하니? 그렇다면 해결책은 다른 코드를 수정하는 것입니다. –

답변

6

기본적으로 동의어 (즉, type을 사용하여 정의 된 내용)는 인스턴스 선언에서 유효하지 않습니다. 그러나 이것을 허용하는 GHC 확장이 있습니다.

그 외에도이 특별한 경우에 showString을 반환해야합니다. 귀하의 인스턴스가 ...와 같은 유형의 동의어 이름을 반환하려고 시도하고 있습니다. 심지어는 Int (show의 경우 잘못된 반환 유형) 목록을 참조합니다.

마지막으로 D은 함수 유형입니다. 그게 어쨌든 show일까요? 대부분의 경우 함수 유형에서 Show 인스턴스로 의미있는 작업을 수행 할 수있는 것은별로 없습니다. 하지만,

{-# LANGUAGE TypeSynonymInstances #-} 
instance Show D where show _ = "Stack -> Stack" 

잘 모르겠어요 즉 실제로 얼마나 유용한 :

당신은 그냥 말하고 싶은 경우

는이 같은 인스턴스를 작성할 수 있습니다 "이 D를 입력입니다."

+0

어쩌면 그는 하나의 [Int]에서 다른 [Int]로 변이를 보여주고 싶습니까? 매개 변수를 표시 한 다음 결과를 표시하는 방법에 대해서는 확실치 않습니다. – Dan