为什么Wadler-Leijen漂亮的打印机使用Union而不是Group?

时间:2018-03-24 21:03:47

标签: haskell pretty-print

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

1 个答案:

答案 0 :(得分:1)

Wadler的算法最早是在Haskell中实现的,该算法被懒惰地评估。

对“组”的评估是从以下两个选项中进行的选择-一个选项将所有分组的文本全部显示在一行上,而一个选项将其全部显示在多行上。这表示为这两个选项的“联合”。一组变成了一个联合,但是由于在Haskell中实现了这两个选项,因此它们的计算只是延迟。

相比之下,请参阅经过严格评估的Stanard ML中的此实现。

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

那里的作者将“组”(Group)定义为原始形式,而不是“联合”(Union)。这样,在评估如何布置组时,仅根据需要计算这两个选项。

Haskell实现中不需要此功能。另请注意,Haskell库具有使用联合的“换行”功能。 SML不能,大概是因为一个团队不能很好地表达软线。 SML的实现本可以采取不同的方法,例如将选择放在一个笨拙的'()-> ...'后面并使其变懒。例如,

===

我刚刚检查了softline的实现,它是“ group Line”,所以我对组不是实现softline的方式是错误的。

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