Sml dobrando uma árvore

Eu estou tentando obter o produto de uma árvore usando a função fold até agora, é isso que eu tenho. Estou confuso sobre como usar o método fold enquanto atravessa a árvore

datatype 'a bin_tree = Leaf of 'a 
| Node of 'a bin_tree * 'a bin_tree


fun treefold g z Empty = z
| treefold g z (Node (l, x, r)) = g(x, g(treefold g z l, treefold g z r)