Первый контекст: я играю с 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
(чтобы продолжить пример симпатичного принтера)?