Я пытаюсь адаптировать Brian's Fold для Bianary Trees (http://lorgonblog.wordpress.com/2008/04/06/catamorphisms-part-two/), чтобы применить к Multiway деревьям.Fold/Recursion over Multiway Tree in f #
Резюмируя из блога Брайена:
структура данных:
type Tree<'a> =
| Node of (*data*)'a * (*left*)Tree<'a> * (*right*)Tree<'a>
| Leaf
let tree7 = Node(4, Node(2, Node(1, Leaf, Leaf), Node(3, Leaf, Leaf)),
Node(6, Node(5, Leaf, Leaf), Node(7, Leaf, Leaf)))
Binary Tree Fold функция
let FoldTree nodeF leafV tree =
let rec Loop t cont =
match t with
| Node(x,left,right) -> Loop left (fun lacc ->
Loop right (fun racc ->
cont (nodeF x lacc racc)))
| Leaf -> cont leafV
Loop tree (fun x -> x)
примеры
let SumNodes = FoldTree (fun x l r -> x + l + r) 0 tree7
let Tree6to0 = FoldTree (fun x l r -> Node((if x=6 then 0 else x), l, r)) Leaf tree7
Многосторонние дерево версия[не (полностью) работает]:
Структура данных
type MultiTree = | MNode of int * list<MultiTree>
let Mtree7 = MNode(4, [MNode(2, [MNode(1,[]); MNode(3, [])]);
MNode(6, [MNode(5, []); MNode(7, [])])])
Fold функция
let MFoldTree nodeF leafV tree =
let rec Loop tree cont =
match tree with
| MNode(x,sub)::tail -> Loop ([email protected]) (fun acc -> cont(nodeF x acc))
| [] -> cont leafV
Loop [tree] (fun x -> x)
Пример 1 Возвращает 28 - похоже на работу
let MSumNodes = MFoldTree (fun x acc -> x + acc) 0 Mtree7
Пример 2
не работает
let MTree6to0 = MFoldTree (fun x acc -> MNode((if x=6 then 0 else x), [acc])) Mtree7
Первоначально я думал, что MFoldTree
нужен был map.something
где-то, но я получил он должен работать с оператором @
.
Любая помощь по второму примеру и/или исправление того, что я сделал в функции MFoldTree
, было бы замечательно!
Приветствия
dusiod
Привет, josejuan, это решение работает для первого случая, но намерение второго - вернуть все дерево, модифицированное так, чтобы любые узлы, которые имели значение 6, например, теперь имеют значение 0. Другой вариант примера 1: 'let MFoldTree2 tree = let rec Loop trees = соответствуют деревьям с | MNode (x, sub) :: tail -> x + (Loop sub) + (Loop tail) | [] -> 0 Loop tree' – dusiod
@dusiod, который не является 'fold'! это «карта»! : D (я обновил решение) – josejuan