type Tree = | Leaf(Int) | Node(Tree, Tree) fn sumTree(tree: Tree): Int = match tree { Leaf(n) => n, Node(left, right) => sumTree(left) + sumTree(right), } fn depth(tree: Tree): Int = match tree { Leaf(_) => 1, Node(left, right) => { let leftDepth = depth(left) let rightDepth = depth(right) 1 + if leftDepth > rightDepth then leftDepth else rightDepth }, } let myTree = Node(Node(Leaf(1), Leaf(2)), Leaf(5)) let treeSum = sumTree(myTree) let treeDepth = depth(myTree) fn safeDivide(a: Int, b: Int): Option = if b == 0 then None else Some(a / b) fn showResult(result: Option): String = match result { None => "Division by zero!", Some(n) => "Result: " + toString(n), } fn printResults(): Unit with {Console} = { Console.print("Tree sum: " + toString(treeSum)) Console.print("Tree depth: " + toString(treeDepth)) Console.print("Safe divide 10/2: " + showResult(safeDivide(10, 2))) Console.print("Safe divide 10/0: " + showResult(safeDivide(10, 0))) } let output = run printResults() with {}