2017-09-11 18 views
2

나는 하스켈 타입 표현하는 유형이 : 나는 하스켈 즉,하지로 인쇄 할하스켈 : 예쁜 인쇄 중위와 접두사

data Type 
    = TApp Type Type 
    | TVar Name 
    | TLit Name 
infixl 8 `TApp` 

-- a -> b 
aToB = TLit "Fun" `TApp` TVar "a" `TApp` TVar "b" 

-- Maybe (IO Int) 
maybeIOInt = TLit "Maybe" `TApp` (TLit "IO" `TApp` TLit "Int") 

, 중위를 인쇄 상징 리터럴을하는 동안 다른 문자 인쇄 접두사 . 필요한 경우 괄호를 추가해야합니다.

show aToB = "a -> b" 
show maybeIOInt = "Maybe (IO Int)" 

show ast = ??? 

어떻게 구현할 수 있습니까?

+1

그냥 이해 자신의 함양을 위해이 일을하는 경우 :

전자를 사용하여 (그리고 type Name = String 가정) /hackage.haskell.org/package/haskell-src-exts-1.19.1/docs/Language-Haskell-Exts-Pretty.html) 하스켈 코드에 대한 예쁜 프린터와 정확한 프린터를 모두 가지고 있습니다. –

답변

3

이 작업을 수행하는 일반적인 방법은 인쇄 기능에 우선 순위 변수를 연결하는 것입니다. 또한, 거의 항상 원시 문자열 (성능상의 이유로 및 용이함)을 사용하는 대신 예쁜 인쇄 라이브러리를 선호해야합니다. GHC는 pretty으로 배송되며 신품으로 prettyprinter을 사용하는 것이 좋습니다./: 그렇지 않으면 나는 [하스켈-SRC-EXTS] (HTTPS 당신을 가리킬 것이다

import Text.PrettyPrint.HughesPJ 

prettyType :: Type -> Doc 
prettyType = go 0 
    where 
    go :: Int -> Type -> Doc 
    go _ (TVar x) = text x 
    go _ (TLit n) = text n 
    go n (TLit "Fun" `TApp` l `TApp` r) = maybeParens (n > 0) (go 1 l <+> text "->" <+> go 0 r) 
    go n (l `TApp` r) = maybeParens (n > 1) (go 1 l <+> go 2 r)