Haskell - 更容易阅读显示功能?(用于调试)

gat*_*ado 10 haskell pretty-print

我正在寻找像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)]
Run Code Online (Sandbox Code Playgroud)

编辑

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

编辑2

pretty-show对我的情况不够好; 它的输出几乎没有不同.我正在用追踪缩进的monad写东西; 如果代码演变成足够好的东西,也许我会把它发布到hackage上.此外,我想PrettyShow为我的自定义类编写实例,就像当前可以编写show实例一样.

C. *_*ann 10

show函数并非真正用于生成可读的输出.如果你看一下从默认的实现deriving子句和在怎么样的语言规范会谈,很明显,showread打算作为简单的形式序列化.此外,序列化格式应该可以解析为Haskell源,以便(假设相关定义在范围内)解释show作为表达式的输出给出等效于反序列化的值read.

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

作为一种快速替代方案,您可能希望输出show至少是更好看的准源代码.这是合理的,也是可能的,因为read它足够聪明,可以忽略空白等.该groom提供了这个功能,在"做最可能工作的最愚蠢的事情"方式:它解析showHaskell源的输出,然后漂亮打印.在实践中,这非常有效.