 <p>You need to put things together differently to accomplish your goal. You can't just replace <code>++</code> with <code>:</code>. Try this:</p> <pre><code>toList t = toListPlus t [] toListPlus :: Tree a -&gt; [a] -&gt; [a] </code></pre> <p><code>toListPlus t xs</code> should produce <code>toList t ++ xs</code>, but implemented with recursive calls to <code>toListPlus</code>, not using <code>++</code> or <code>toList</code>. Let's work through it. The base case is easy:</p> <pre><code>toListPlus Empty xs = xs </code></pre> <p>The recursive case isn't too bad either. We want to convert the left subtree to a list, sticking other stuff on after:</p> <pre><code>toListPlus (Node v l r) xs = toListPlus l ??? </code></pre> <p>What comes after? The root, and then the result of converting the right subtree, and then whatever gets tacked on:</p> <pre><code>toListPlus (Node v l r) xs = toListPlus l (v : toListPlus r xs) </code></pre> <p>This function uses an implicit stack to keep track of the remaining work. This is probably the most efficient way to do it. If you wanted, you could use a zipper-style representation to make the stack explicit.</p> <hr> <p>How does this solution relate to the one leftaroundabout described? Well, they're actually the same. We can see that by shifting the list argument over:</p> <pre><code>toListPlus Empty = \xs -&gt; xs toListPlus (Node v l r) = \xs -&gt; toListPlus l (v : toListPlus r xs) = toListPlus l . (v :) . toListPlus r </code></pre>