Lambda 在F#中,如何将一个连续体列表转换为一个包含列表的连续体?
首先是一些上下文:我正在玩来自的Lambda 在F#中,如何将一个连续体列表转换为一个包含列表的连续体?,lambda,f#,functional-programming,continuations,continuation-passing,Lambda,F#,Functional Programming,Continuations,Continuation Passing,首先是一些上下文:我正在玩来自的KFoldTree。我有一个n元而不是二进制的树结构。对于二叉树,将CPS变换应用于传递给KFoldTree的函数并不难。你最终会得到这样的结果: kleft (fun left -> kright (fun right -> k (dosomethingwith left right))) n元树的问题是,您必须动态地构建这个连续链。你想要的结果应该是这样的: kchildren (fun children -> k (dosomething
KFoldTree
。我有一个n元而不是二进制的树结构。对于二叉树,将CPS变换应用于传递给KFoldTree
的函数并不难。你最终会得到这样的结果:
kleft (fun left -> kright (fun right -> k (dosomethingwith left right)))
n元树的问题是,您必须动态地构建这个连续链。你想要的结果应该是这样的:
kchildren (fun children -> k (dosomethingwith children))
其中children
是折叠结果类型的列表。例如,如果我正在编写一台漂亮的打印机,子项
应为字符串列表
类型,而kchildren
应为(字符串列表->字符串)->字符串
类型
那么,在给定
((节点->字符串)->字符串)列表的情况下,我们如何定义一个生成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 []
有更好的办法吗