漂亮的haskell打印数据结构

时间:2017-03-25 22:25:32

标签: haskell

我是Haskell的初学者,我想在Haskell中使用数据结构进行漂亮的打印。

我有以下数据结构:

https://codeshare.io/5zl9WD

我想打印以下值:

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数据结构如下:

https://codeshare.io/G64gyg

但老实说,我不知道。我有很多类似的简单印刷品。如果我能对这种印刷有所了解,剩下的就不会成为问题。

但是可能是使用document数据类型打印上述值的最短方法吗?

1 个答案:

答案 0 :(得分:1)

为abstract-syntax-tree中的每个类型编写一个漂亮的打印机函数。每个函数都有类型:

pretty<Foo> :: <Foo> -> Document

使用类型名称替换<Foo>。自下而上,因此您可以在编写时测试每个功能。即首先为Type实现漂亮的打印机,因为漂亮的打印机需要Stmtf(应该称为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

ExpStmtCaseFunc中的每一个采用相同的模式。