
Steve Downey wrote:
The primary goal of writing source code isn't to communicate to a computer, but to communicate to a human being. That implies that the communication should be at a high enough level of abstraction to be easily understood by people, while not losing the precision necessary for a computer. OO, at least when done well, maps well to how people think. Things that can be directed to perform actions. There is also a well developed practice of OO analysis and design. It's not clear (at least to me) that there is an equivalent set of practices for functional programming.
Some of Haskell constructs come from the area of formal methods. Notably, algebraic types come from Z-notation (as I am told). Formal methods in general and Z notation in particular precede OO as defined, for example, in Smalltalk-80. Formal methods do not require substantial training and/or costly tools (although both exists). It can be trained in several weeks and start bringing benefits. Here are two surveys (somewhat outdated) on the use of formal methods in industry: http://citeseer.ifi.unizh.ch/39426.html http://citeseer.ifi.unizh.ch/craigen93international.html So, you can safely borrow methodics from formal methods and even think about Hindley-Milner type system as a theorem prover.