Example

Type
data MathExpr =
Leaf int
| Unary (Int -> Int, MathExpr)
| Binary (Int -> Int -> Int, MathExpr, MathExpr)
eval (Left v) = v
eval (Unary (f,t)) = f (eval t)
eval (Binary (f,l,r)) = f (eval l) (eval r)Implementing Tree
t = Binary( (+),
Binary((+)
Unary(abs,
Unary ((0-),
Leaf 3
),
Leaf 2
),
),
Binary((*),
Binary((+),
Unary((0-),
Leaf 1
),
Leaf 4
),
Leaf 7
)
)