@John
Top level values have the attributes that you describe, recursion, mutual recursion are possible.
So by using `let` and `where`, with out knowing any additional rules or information, we can define values and functions which can be locally scoped. Reducing the number of top level values by using locally scoped vales often makes it easier to think about a problem.
You concern seems to be focused on the mutual recursion aspect however. Why it is it useful in general? It allows for problems to be broken down in to sub problems and solved separately.
With out mutually recursion or something similar if you had a problem that need to recurse in two different ways, each which some times depended on the other you would have to write it all in one large function.
An example where this is used in serious cod would be pipes and conduit. Both handle stream processing of data.
Mutual recursion between (>>~) and (+>>)
Look at the goRight and goLeft functions that are locally scoped with `where` in either the `pipe` or `pipeL` functions.
So can help as a tool to break some problems in to subproblems and it is used in serious code in Haskell
Patrick