在 F# 中,如何将延续列表转换为采用列表的延续?
In F#, how can I turn a list of continuations into a continuation that takes a list?
首先是一些上下文:我正在玩弄来自 this excellent blog post 的 KFoldTree
。我有一个 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 []
有没有更好的方法?
首先是一些上下文:我正在玩弄来自 this excellent blog post 的 KFoldTree
。我有一个 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 []
有没有更好的方法?