我是Haskell的初学者,我想在Haskell中使用数据结构进行漂亮的打印。
我有以下数据结构:
我想打印以下值:
int a(int b, int* c){
return b + *c;
}
使用以下函数类型:
pFunc :: f -> document
putStrLn $ pretty 40 $ pFunc fun
fun =("a", TInt, [(TInt, "b"),(TPtr TInt, "c")]
, [SReturn (EBinOp "+" (EIdent "b") (EUnOpPre "*" (EIdent "c")))])
document
数据结构如下:
但老实说,我不知道。我有很多类似的简单印刷品。如果我能对这种印刷有所了解,剩下的就不会成为问题。
但是可能是使用document
数据类型打印上述值的最短方法吗?
答案 0 :(得分:1)
为abstract-syntax-tree中的每个类型编写一个漂亮的打印机函数。每个函数都有类型:
pretty<Foo> :: <Foo> -> Document
使用类型名称替换<Foo>
。自下而上,因此您可以在编写时测试每个功能。即首先为Type
实现漂亮的打印机,因为漂亮的打印机需要Stmt
和f
(应该称为Func
或其他)。< / p>
例如:
prettyType :: Type -> Document
prettyType TVoid = text "void"
prettyType TInt = text "int"
prettyType TFloat = text "float"
prettyType TChar = text "char"
prettyType TPtr t = prettyType t <> text "*"
prettyType TStruct s = text "struct" <+> text s
对Exp
,Stmt
,Case
和Func
中的每一个采用相同的模式。