
On Fri, Sep 02, 2005 at 05:10:35PM +1000, Ben Lippmeier wrote:
... It's very hard to debug a large program when you can randomly get messages like "*** Exception: Prelude.head: empty list" and have no idea where they came from.
As a purely pragmatic suggestion: don't use head, fromJust, last, or any other function that is likely to fail in impossible-to-find way, at least not directly.
In GHC, you can wrap or replace them with irrefutable patterns which are almost as easy to write, and will give you a sensible error message if they fail.
That's a good suggestion. One can also use the C preprocessor to get decent error messages: #define fromJust (\m_fromJust_funny_name -> case m_fromJust_funny_name of {Nothing -> bug ("fromJust error at "++__FILE__++":"++show (__LINE__ :: Int)++" compiled "++__TIME__++" "++__DATE__); Just x -> x}) Do to the usage of the C preprocessor, this is likely to fail if you've got variables names something like x', but apart from that it works nicely, and allows you to do stuff like foo = head . tail . sort . head which could be ugly when written in terms of irrefutable patterns. -- David Roundy http://www.darcs.net