【问题标题】:Is there a pretty printing (or showing) abstraction in Haskell?Haskell 中是否有漂亮的打印(或显示)抽象?
【发布时间】:2015-09-11 21:49:26
【问题描述】:

是否没有标准方法可以打印出最终用户消费的值?鉴于围绕其使用的约定和read (show x) == x 的约束,Show 显然比用于此目的的东西更方便调试。

例如,是不是至少有一个简单的包像

class (Show a) => PShow a where 
    pshow :: a -> String
    pshow = show

pprint :: (PShow a) => a -> IO () 
pprint = putStrLn . pshow

实例在哪里做类似的事情

instance PShow MyType where
    pshow a = someUserFriendlyStringOf a

请注意,我并不是要提供精细的漂亮打印和格式化功能(我看到有几个包可以做到这一点),只是为了一个简单的抽象,它被广泛使用,允许漂亮的打印。有这样的事情吗?

【问题讨论】:

    标签: haskell printing pretty-print


    【解决方案1】:

    请注意,我并不是要提供精美的打印和格式化功能(我看到有几个包可以做到这一点)

    这是有原因的。编写这些复杂库的人之所以这样做,是因为他们无法用简单的东西完成工作。您已经通过提供两种不同的方法暗示了一些复杂性,我们可能不会做同样的事情,没有关于何时使用的指导。

    从积极的方面来说,我不会太担心read。关注Show 实例(可能带有 GHC 扩展)可以为您提供代码以剪切和粘贴到您的程序中。

    【讨论】:

    • 这里没有“工作”可做,尽管除了允许像pprint 这样的常见用法导致与print 非常等价(由于pshow 的类型定义实现) 与print/show 并行。实现这一目标缺少什么? (我已经削减了我认为混淆问题的部分)。我的观点是:似乎很多类型产生有意义的最终用户显示需要植入pprint,所以为什么不抽象这个简单的事实。
    • 请注意,我从未说过这些库是精心制作的,但 this “库”并非旨在提供精细的功能。这只是胶水。
    • *"implant" = "implement"(5 分钟规则很愚蠢)。
    • @raxacoricofallapatorius 许多漂亮的打印库抽象了它。 example
    • @raxacoricofallapatorius,我可以建议你编写你想要的库吗,因为(你声称)它很简单,用一些实际的例子展示它的实用性,并让它在 Hackage 上可用?最终,这就是所有库的开始方式。
    【解决方案2】:

    我刚刚通过Hoogle 搜索a -> String 并找到了Language.Haskell.Pretty 模块。

    模块定义了三个简单的函数:

    prettyPrintStyleMode :: Pretty a => Style -> PPHsMode -> a -> String
    具有给定样式和模式的漂亮打印。

    prettyPrintWithMode :: Pretty a => PPHsMode -> a -> String
    使用默认样式和给定模式进行漂亮打印。

    prettyPrint :: Pretty a => a -> String
    使用默认样式和默认模式进行漂亮打印。

    整个类型类似乎比您要求的要复杂一些,但也许有帮助

    【讨论】:

    • 是的,这就是我所指的软件包之一。这些都证明了我的观点:同一件事有很多方法。我的重点是“相同的东西”:有一个抽象位于所有这些包之上,以及许多(我希望很常见)类型特定的情况,其中@ 987654324@ 需要从头开始编写。我的问题是这种抽象是否已经是语言的一部分,或者已经在轻量级包中实现。
    • 换句话说,所有这些包都包含一个类(这里是Pretty),它是Show的一个实例,即使放在一起,这些包可能大多不适合自定义渲染任意(丰富的、结构化的)价值观。
    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2012-05-04
    • 2011-03-23
    相关资源
    最近更新 更多