【问题标题】:Why does a Wadler-Leijen pretty printer use Union instead of Group?为什么 Wadler-Leijen 漂亮的打印机使用 Union 而不是 Group?
【发布时间】:2018-09-03 07:51:42
【问题描述】:

Hughes-style 漂亮的打印组合器使用Union 原语来描述不同布局的集合,但WadlerUnion 替换为Group,它会尝试将其参数布局在一行上,然后换行如果它不能。然而,最新的Wadler-Leijen 组合子使Union 原语,并将group d 定义为Union (flatten d) d。两种表示之间的取舍是什么,为什么 Wadler-Leijen 漂亮的打印机使用Union

【问题讨论】:

    标签: haskell pretty-print


    【解决方案1】:

    Wadler 算法最早是在 Haskell 中实现的,是惰性求值的。

    “组”被评估为 2 个选项中的一个选项 - 一个将分组文本全部放在一行上,一个将其放在多行上。这表示为这两个选项的“联合”。一个组变成了一个联合,但由于在 Haskell 中实现,这两个选项只是懒惰地计算。

    相比之下,请参阅严格评估的标准 ML 中的此实现。

    https://github.com/kfl/wpp/blob/master/Wpp.sml

    那里的作者将“Group”设为原始而不是“Union”。这样一来,在评估如何布局组时,仅按需计算 2 个选项。

    这在 Haskell 实现中是不需要的。另请注意,Haskell 库有一个使用联合的“软线”功能。 SML 没有,大概是因为软线没有被一个组很好地表达。 SML 实现本可以采取不同的方式,例如,将选择放在一个 thunk '() -> ...' 后面的联合之下,以使它们更懒惰。

    ===

    我刚刚检查了softline的实现,它是'group Line',所以我错了group不是实现softline的方式。

    我仍然认为答案是 union 是两种布局的一般选择,但 group 是单行或多行布局之间的特定选择,其他选择应该是可能的,并且可以由布局算法处理。

    【讨论】:

    • 那是有道理的,但正如你所指出的,为什么不让 Union 变得懒惰呢?
    • 我猜在那个 SML 实现中,作者除了作为一个团队之外没有打​​算做任何形式的联合——也许是一个很好的洞察力。
    • 我把它移植到 Elm,我目前有一个非懒惰的 Union。现在考虑是否应该替换为 Group 或让 Union 变得懒惰。我想我会和 Group 一起去,直到我觉得有必要实施某种其他类型的联合。
    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2013-06-20
    相关资源
    最近更新 更多