在Haskell的格式库中修改格式化程序

时间:2015-05-15 10:56:46

标签: haskell formatting

我正在使用Chris Done的formatting库(特别是格式化6.0.0)。我发现很难构建一个“高阶”函数,它将格式化程序映射到列表格式化程序,对结果列表中的构建器执行自定义操作:

list :: ([Builder] -> Builder) -> Format r (a -> r) -> Format r ([a] -> r)

这是可取的,因为它允许我在格式字符串中嵌入构建器格式化逻辑。

例如,假设构建器函数只是mconcat。然后format (list mconcat int) [1,2,3]会产生"123"。在实践中,我可以使用构建器函数将列表格式化为英语列表,以便上面输入的输出为"1, 2 and 3"

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

让我们从list :: ([Builder] -> Builder) -> Format r (a -> r) -> Format r ([a] -> r)

中展开Format类型
 Format            r     (a -> r) -> Format            r     ([a] -> r)
 Holey  Builder    r     (a -> r) -> Holey  Builder    r     ([a] -> r)
(      (Builder -> r) -> (a -> r))->(      (Builder -> r) -> ([a] -> r))

我们可以尝试构建list的定义。

list append m = Holey $ \k -> ...

我们需要返回[a] -> r所在的...。我们没有太多可能的动作,因为我们对类型r一无所知。我们可以将k :: Builder -> r传递给runHM m以获得a -> r。如果我们map [a]以上[r]我们有r,但我们对list一无所知,那么我们就无法做任何事情。

如果存在([Builder] -> Builder) -> Format r (a -> r) -> Format r ([a] -> r)之类的函数,则其类型与list不同。

我们可以使用不同类型list :: ([Builder] -> Builder) -> Format Builder (a -> Builder) -> Format r ([a] -> r)定义r。这应该适用于大多数第一个参数,因为大多数格式化组件都是普遍适用于所有list append m = Holey $ \k -> k . append . map (runHM m id)

list append m = later (append . map (bprint m))

这可以更简洁地写成

gallery.php