Performing an action which may return other actions to be performed, concurrently
I think yours works, but async specializes in this stuff.

recurseAsync :: (a -&gt; IO [a]) -&gt; a -&gt; IO [a]
recurseAsync f a = do
  xs &lt;- f a
  fmap concat $ mapConcurrently (recurseAsync f) xs