Haskell:漂亮的打印中缀和前缀

时间:2017-09-11 01:57:21

标签: haskell types abstract-syntax-tree pretty-print

我有一个代表haskell类型的类型:

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")

我想像haskell那样打印它,即,符号的文字是打印中缀而其他文字是打印前缀。 必要时还应加上括号:

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

show ast = ???

我该如何实现?

1 个答案:

答案 0 :(得分:3)

通常的方法是将打印功能的优先级变量线程化。此外,您几乎总是应该更喜欢漂亮的打印库而不是仅仅使用原始字符串(出于性能原因和易用性)。 GHC附带pretty,我也推荐较新的prettyprinter

使用前者(并假设为step2 = step1[0:2] + ':' + step1[2:4] + ':' + step1[4:6] + ':' + step1[6:8] + ':' + step1[8:10] + ':' + step1[10:12] step3 = step2.upper() ):

type Name = String