&gt; One problem, I believe, is that functional languages encourage more of a bottom-up approach to design<p>Anecdotally, I tend to write Haskell &quot;top-down&quot;, e.g. writing QuickCheck tests for top-level functions, writing dummy definitions with `undefined`, and fleshing things out as and when the tests require it.