I am trying to adapt Brian Fold to Bianary trees ( http://lorgonblog.wordpress.com/2008/04/06/catamorphisms-part-two/ ) to apply to Multiway trees.
To summarize from Brian's blog:
Data structure:
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 function 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)
examples
let SumNodes = FoldTree (fun xlr -> x + l + r) 0 tree7 let Tree6to0 = FoldTree (fun xlr -> Node((if x=6 then 0 else x), l, r)) Leaf tree7
Multiway Tree version [not (fully) working]:
Data structure
type MultiTree = | MNode of int * list<MultiTree> let Mtree7 = MNode(4, [MNode(2, [MNode(1,[]); MNode(3, [])]); MNode(6, [MNode(5, []); MNode(7, [])])])
Fold Function
let MFoldTree nodeF leafV tree = let rec Loop tree cont = match tree with | MNode(x,sub)::tail -> Loop (sub@tail) (fun acc -> cont(nodeF x acc)) | [] -> cont leafV Loop [tree] (fun x -> x)
Example 1 Returns 28 - seems to work
let MSumNodes = MFoldTree (fun x acc -> x + acc) 0 Mtree7
Example 2
Does not work
let MTree6to0 = MFoldTree (fun x acc -> MNode((if x=6 then 0 else x), [acc])) Mtree7
I originally thought that MFoldTree needed map.something somewhere, but I got it to work with the @ operator.
Any help on the second example and fixing what I did in the MFoldTree function would be great!
Greetings
dusiod