gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:22:54 27 4
gpt4 key购买 nike

我正在从 H 切换到 L

import qualified Text.PrettyPrint.HughesPJ as H
import qualified Text.PrettyPrint.Leijen as L

我在翻译 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)

但我只得到这个:
 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)

(不尊重内部文档的格式)或者这个:
 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)

这是丑陋的。

最佳答案

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

λ> L.fillSep $ map (\d -> L.parens $ L.hsep $ 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)

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

这是一个更接近 HughesPJ 行为的函数:
fsep :: [L.Doc] -> L.Doc
fsep = foldl1 (\x y -> x L.<> (L.group $ L.line L.<> y))

λ> fsep $ 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)

什么 group通过更改所有 line 将输出放在一行上。转至 space如果结果输出适合当前行,否则保持原始格式。所以 fsep输出列表的开头,如果下一项完全适契约(Contract)一行,则将其附加到该行。否则在下一个列表元素之前插入一个换行符。

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

关于haskell - 如何在 Text.PrettyPrint.Leijen 中获取 Text.PrettyPrint.HughesPJ.fsep 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21650932/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com