
I'm pretty new to Haskell, so take what I say with a very large grain of salt. But this is a topic I've been thinking about because I happen to be teaching a lab on TDD to Java and C developers at the moment, while I myself am programming in Haskell in my research. So perhaps my impressions will be of some use to you. There are two reasons why I'm less likely to do TDD in Haskell. By far the most important is the availability of a tool like QuickCheck. QuickCheck changes everything. I don't write tests, I write properties. QuickCheck generates the tests on the fly, and does a better job than I could. There's a big difference between writing properties and writing tests. If I were going to develop a large application in Haskell, I'd try to honour the spirit of TDD by defining properties before implementing functions. A secondary reason is the availability of the interpreter. I test functions in the interpreter as I write them. Of course, I'm not doing a very thorough job, but I'll use QuickCheck to do the "real" testing. I use the interpreter to test whether the function does what I designed it to do, with some typical inputs. I then use QuickCheck to verify that the function behaves nicely no matter what inputs it gets, including inputs I might not have even thought of trying. FWIW, I do plan to use HUnit to test the non-functional part of my application.