2

Первый контекст: я играю с KFoldTree от this excellent blog post. У меня есть древовидная структура, которая является n-ary вместо двоичного. С бинарным деревом применение преобразования CPS к функции, которую вы переходите на KFoldTree, не слишком сложно. Вы в конечном итоге что-то вроде:В F #, как я могу превратить список продолжений в продолжение, которое принимает список?

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

Проблема с п-арной дерева является то, что вы должны построить эту цепочку продолжений на лету. То, что вы хотите, чтобы в конечном итоге должно выглядеть примерно так:

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

где children представляет собой список типа результата складки. Например, если я пишу симпатичный принтер, children должен иметь тип string list, а kchildren должен быть типа (string list -> string) -> string.

Итак, как мы определяем функцию, которая производит kchildren, учитывая ((Node -> string) -> string) list (чтобы продолжить пример симпатичного принтера)?

ответ

0

Это то, что я придумал:

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 [] 

Есть ли лучший способ?