День добрый всем.
Есть у меня тип n-арного дерева, определенным следующим образом:
type 'a Tree =
| Node of 'a * 'a Tree seq
| Leaf of 'a
И захотелось мне написать для него функцию свертки. Родилось нечто следующее:
let rec fold procLeaf procNode = function
| Leaf(x) -> procLeaf x
| Node(x, children) -> children |> Seq.map (fold procLeaf procNode) |> procNode x
А теперь возник вопрос. Как сделать эту функцию хвостово-рекурсивной с помощью CPS? Если бы ветвей было наперед известное конечное число, я процесс представляю, но вот как вывести такую большую-большую лямбду из n вложенных вызовов fold', а потом еще и все аргументы из всех лямбд передать последовательностью в procNode — ума не приложу.
Заранее благодарен за помощь.