type Tree = Unit + N * Tree * Tree leaf : Tree leaf = left(■) node : N * Tree * Tree -> Tree node(x, l, r) = right(x, l, r) tree1 : Tree tree1 = node(3, node(5, node(1, leaf, leaf), leaf), node(6, node(2, leaf, leaf), node(8, leaf, leaf))) treeFold : r * (N * r * r -> r) * Tree -> r treeFold(x, f, left(■)) = x treeFold(x, f, right(n,l,r)) = f(n, treeFold(x, f, l), treeFold(x, f, r)) treeSum : Tree -> N treeSum(t) = treeFold(0, \(x,l,r). x + l + r, t) treeSize : Tree -> N treeSize(t) = treeFold(0, \(x,l,r). 1 + l + r, t) treeHeight : Tree -> N treeHeight(t) = treeFold(0, \(x,l,r). 1 + l max r, t)