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 _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe