如何使用Haskell的漂亮打印功能进行缩进的层次嵌套

3
我希望使用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个回答

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

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

是的,递归地。我漏掉了“draw”的定义;已添加在上面,应该与你的一样。我的错误是在“text(draw e)”上进行递归,它使用了render.pretty,而不是直接在“pretty e”上进行递归。虽然我不确定为什么会导致出错...谢谢! - guthrie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接