<div dir="ltr">Given<div>data Tree a = Leaf a | Node (Tree a) (Tree a)<br></div><div><br></div><div>Write a leaf counter.</div><div><br></div><div>Hutton suggests:</div><div><br></div><div><div><font face="monospace">leaves :: Tree a -> Int</font></div><div><font face="monospace">leaves (Leaf _) = 1</font></div><div><font face="monospace">leaves (Node l r) = leaves l + leaves r</font></div></div><div><font face="monospace"><br></font></div><div>I tried:</div><div><br></div><div><div><font face="monospace">leavesTrent :: Tree a -> Int</font></div><div><font face="monospace">leavesTrent = leaves' 0</font></div><div><font face="monospace">         where</font></div><div><font face="monospace">           leaves' n (Leaf a) = n + 1</font></div><div><font face="monospace">           leaves' n (Node l r) = (leaves' n l), (leaves' n r)</font></div></div><div><font face="monospace"><br></font></div><div>The idea is:</div><div><br></div><div>If it is a leaf, add one to the accumulator.  (Following Hutton's explanation of how sum works if defined with foldl.)   If it is a tree, proceed down the left subtree recursively, until you get to a leaf, then roll up to the right subtree.  The problem (among the problems) is that I don't know how to tell the compiler to do all lefts, before backing up to go right.  I only know how to do that using a real operator like "+" or foo (l, r).</div><div><br></div><div>Is that kind of no-op recursive branching possible?</div><div><br></div><div>Trent.</div></div>