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)
这是丑陋的.
hsep一个简单的解决方案是在括号内使用
\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)\nRun Code Online (Sandbox Code Playgroud)\n\n但这意味着内部文档将始终水平打印。
\n\n下面是一个更接近 HughesPJ 行为的函数:
\n\nfsep :: [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)\nRun Code Online (Sandbox Code Playgroud)\n\n如果group结果输出适合当前行,则通过将所有lines 更改为space将输出放在单行上,否则保持原始格式。因此fsep输出列表的开头,如果下一个项目完全适合同一行,则将其附加到该行。否则,将在下一个列表元素之前插入换行符。
一般来说,我经常发现group手动使用控制输出比依赖softline和更容易</>。
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |