我正在使用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"
。
感谢您的帮助!
答案 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