如何在Text.PrettyPrint.Leijen中获取Text.PrettyPrint.HughesPJ.fsep行为?

d8d*_*f42 6 haskell pretty-print

我正在从H切换到L.

import qualified Text.PrettyPrint.HughesPJ as H
import qualified Text.PrettyPrint.Leijen as L
Run Code Online (Sandbox Code Playgroud)

我在翻译H.fsep("段落填充")时遇到了问题.

这就是我要的:

H.fsep  $ map ( \ d -> H.parens $ H.fsep $ replicate 4 d ) $ map (H.text . show) [1..10]

(1 1 1 1) (2 2 2 2) (3 3 3 3) (4 4 4 4) (5 5 5 5) (6 6 6 6)
(7 7 7 7) (8 8 8 8) (9 9 9 9) (10 10 10 10)
Run Code Online (Sandbox Code Playgroud)

但我只能得到这个:

 L.fillSep  $ map ( \ d -> L.parens $ L.fillSep $ replicate 4 d ) $ map (L.text . show) [1..10]

(1 1 1 1) (2 2 2 2) (3 3 3 3) (4
4 4 4) (5 5 5 5) (6 6 6 6) (7 7
7 7) (8 8 8 8) (9 9 9 9) (10 10
10 10)
Run Code Online (Sandbox Code Playgroud)

(不尊重内部文档的格式)或者:

 L.fillSep  $ map ( \ d -> L.parens $ L.align $ L.fillSep $ replicate 4 d ) $ map (L.text . show) [1..10]

(1 1 1 1) (2 2 2 2) (3 3 3 3) (4
                               4 4 4) (5 5 5 5) (6 6 6 6) (7 7
                                                           7 7) (8 8 8 8) (9 9 9
                                                                           9)
(10 10 10 10)
Run Code Online (Sandbox Code Playgroud)

这是丑陋的.

Twa*_*ven 4

hsep一个简单的解决方案是在括号内使用

\n\n
\xce\xbb> L.fillSep $ map (\\d -> L.parens $ L.hsep $ replicate 4 d) $ map (L.text . show) [1..10]\n(1 1 1 1) (2 2 2 2) (3 3 3 3)\n(4 4 4 4) (5 5 5 5) (6 6 6 6)\n(7 7 7 7) (8 8 8 8) (9 9 9 9)\n(10 10 10 10)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这意味着内部文档将始终水平打印。

\n\n

下面是一个更接近 HughesPJ 行为的函数:

\n\n
fsep :: [L.Doc] -> L.Doc\nfsep = foldl1 (\\x y -> x L.<> (L.group $ L.line L.<> y))\n\n\xce\xbb> fsep $ map (\\d -> L.parens $ L.fillSep $ replicate 4 d) $ map (L.text . show) [1..10]\n(1 1 1 1) (2 2 2 2) (3 3 3 3)\n(4 4 4 4) (5 5 5 5) (6 6 6 6)\n(7 7 7 7) (8 8 8 8) (9 9 9 9)\n(10 10 10 10)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果group结果输出适合当前行,则通过将所有lines 更改为space将输出放在单行上,否则保持原始格式。因此fsep输出列表的开头,如果下一个项目完全适合同一行,则将其附加到该行。否则,将在下一个列表元素之前插入换行符。

\n\n

一般来说,我经常发现group手动使用控制输出比依赖softline和更容易</>

\n