如何使用Haskell漂亮打印来分层“嵌套”缩进

时间:2011-04-22 04:45:27

标签: haskell pretty-print

我想使用Haskell Pretty软件包打印出一个AST。

一切正常,但嵌套构造不能正确缩进。

我这样做:

draw :: Pretty a => a -> String
draw = render.pretty

pretty (Letin  d  c ) =  text "let" <+> text (draw d) $$
                         nest 4 (text "in" <+> text (draw c))

但结果是这样的:

let Const  x := 2
    in let Var  y := Int 
    in y = 3; let Var  z := Int 
    in z = 0; z = z + 1 

似乎嵌套级别不是继承的,所以在+4边距上都是绝对的,而不是在每个级别连续缩进,即相对于它们的父级+4当前缩进级别。

1 个答案:

答案 0 :(得分:3)

你的意思是递归地呼叫pretty吗?我无法从你的问题中说出来。

快速测试以尝试重现您已完成的工作:

import Text.PrettyPrint

data Letin = Letin String (Maybe Letin)

draw = show

pretty (Letin  d  c ) =
     text "let" <+> text (draw d) $$
        nest 4 (text "in" <+> case c of Nothing -> text "empty";
                                        Just c' -> pretty c')

按预期结果:

let "x"
    in let "y"
           in empty

因此您可能需要列出更多代码。