在 F# 中,如何将延续列表转换为采用列表的延续?

In F#, how can I turn a list of continuations into a continuation that takes a list?

首先是一些上下文:我正在玩弄来自 this excellent blog postKFoldTree。我有一个 n 元而不是二进制的树结构。使用二叉树,将 CPS 转换应用于传递给 KFoldTree 的函数并不难。你最终会得到类似的东西:

kleft (fun left -> kright (fun right -> k (dosomethingwith left right)))

n 叉树的问题在于您必须即时构建此延续链。你想要的结果应该是这样的:

kchildren (fun children -> k (dosomethingwith children))

其中 children 是折叠结果类型的列表。例如,如果我正在编写一个漂亮的打印机,children 应该是 string list 类型,而 kchildren 应该是 (string list -> string) -> string.

类型

那么在给定 ((Node -> string) -> string) list 的情况下,我们如何定义一个生成 kchildren 的函数(继续漂亮打印机示例)?

这是我想出的:

let chain continuations cont =
    let rec loop acc =
        function
        | k::ks -> k (fun x -> loop (x::acc) ks)
        | [] -> cont acc
    // Reverse the input list to preserve original left-to-right order.
    List.rev continuations |> loop []

有没有更好的方法?