Do you sometimes encounter the dreaded "pattern match failure: head " message? Do you have incomplete patterns which sometimes fail? Do you have incomplete patterns which you know don't fail, but still get compiler warnings about them? Would you like to statically ensure the absence of all calls to error?
For the last few years I've been working on a pattern-match checker for Haskell, named Catch. I'm now happy to make a release:
- Hackage: catch
- Homepage: http://www-users.cs.york.ac.uk/~ndm/catch/
- User manual: http://www.cs.york.ac.uk/fp/darcs/catch/catch.htm
- Detects all incomplete patterns and calls to error
- Full support for Haskell, through the use of Yhc as a front end
- Automatic - no annotations are required
- Fast - checking times of under 5 seconds (excluding Yhc compilation)are typical
- Requires Yhc to be installed, which doesn't accept most Haskell extensions. This will be fixed once GHC.Core is available as a standalone library. The underlying tool is not limited to Haskell 98 in any way.
1.4 Related work:
- Liquid Haskell - Annotate your functions with invariants that are checked at compile-time.
- The total package does not search for incomplete pattern matches, but it does allow you to write compiler-checked exhaustive pattern matches. Blog post here.
- exhaustive Does the same, but without lenses.
1.5 Success stories:
- The darcs version of HsColour has been proven free of pattern match errors, and Catch was able to find three previously unknown crashes which could be triggered by a malformed document.
- System.FilePath has been checked, and is free of pattern-match errors.
- Xmonad's central StackSet.hs module has been checked repeatedly, as it has evolved. Unfortunately currently this module goes beyond Haskell 98, but this should be fixed shortly.
If you have any experiences with Catch, I'd be very interested to hear them.