Haskell——更容易阅读显示函数?(调试)



我正在寻找一个像show这样的函数,它可以产生更可读的输出。当然,它不一定适用于所有的类。我在Google上搜索了"haskell pretty print",但这似乎产生了编译器源代码打印机。调试像下面这样的东西(手动插入的换行符用于stackoverflow格式化)是困难的!

(fromList [(Ref {name = "phi", lenRef = 4},fromList [CompNode {val = 1, ident = CNId {uid =     4,
 zone = 0}, deps = []},CompNode {val = 2, ident = CNId {uid = 5, zone = 0}, deps = []},CompNode 
{val = 3, ident = CNId {uid = 6, zone = 0}, deps = []},CompNode {val = 4, ident = CNId {uid = 7, 
zone = 0}, deps = []}] :: Data.Vector.Vector),(Ref {name = "phi'", lenRef = 2},fromList [CompNode 
{val = -1, ident = CNId {uid = 0, zone = 0}, deps = []},CompNode {val = -1, ident = CNId {uid = 1, 
zone = 0}, deps = []}] :: Data.Vector.Vector),(Ref {name = "psi", lenRef = 2},fromList [CompNode 
{val = -1, ident = CNId {uid = 8, zone = 0}, deps = [CompNode {val = 1, ident = CNId {uid = 4, zone
 = 0}, deps = []},CompNode {val = 2, ident = CNId {uid = 5, zone = 0}, deps = []}]},CompNode {val = 
-1, ident = CNId {uid = 3, zone = 0}, deps = []}] :: Data.Vector.Vector)]

编辑

好吧,我忘了"print"在haskell中更准确地说是"show"…有一个"漂亮秀"套餐。然而,它似乎只是调用show,解析字符串,并尝试以一种很好的方式输出它。我真的想要一些东西,暴露一个新的类结构,例如class PrettyShow a where prettyShow :: a -> String

编辑2

pretty-show对我的情况来说不够好;它的产出几乎没有什么不同。我在写一个单子来跟踪缩进;如果代码发展得足够好,也许我会把它发布在hackage上。此外,我想为我的自定义类编写PrettyShow实例,就像目前可以编写show实例一样。

show函数并不是真正想要生成可读性很好的输出。如果您查看deriving子句的默认实现以及语言规范是如何谈论它的,那么很明显,showread旨在作为一种简单的序列化形式。此外,序列化的格式预计可以解析为Haskell源,这样(假设相关定义在范围内)将show的输出解释为表达式给出的值等同于用read对其进行反序列化。

如果你想要漂亮的,格式化的输出,看起来不像Haskell源,标准术语仍然是"漂亮的打印",没有标准的通用方法来做到这一点。但是,如果您稍微浏览一下Hackage,就会发现有一些漂亮的打印库提供了构建自己的漂亮打印机的原语。请注意,即使他们在编译器中谈论漂亮的打印语法树,这只是一个例子;任何树状结构都应该可以正常工作。

作为一种快速替代方法,您可能希望show的输出至少是看起来更好的准源代码。这是合理和可能的,因为read足够聪明,可以忽略空格等。groom包以一种"做可能工作的最愚蠢的事情"的方式提供了这个功能:它将show的输出解析为Haskell源,然后将其漂亮地打印出来。

最新更新