我有一个代表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 = ???
我该如何实现?
答案 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