2013/4/16 Ross Paterson <R.Paterson@city.ac.uk>
On Tue, Apr 16, 2013 at 10:17:48AM +0100, Tom Crayford wrote:
>  The core API is very simple:
>
> data Matcher a = Matcher {
>     match :: a -> Bool
>   -- ^ A function that returns True if the matcher should pass, False if it
> should fail
>   , description :: String
>   -- ^ A description of the matcher (usually of its success conditions)
>   , describeMismatch :: a -> String
>   -- ^ A description to be shown if the match fails.
>   }

How about combining match and describeMismatch as a single function
of type a -> Match?  Then you wouldn't need the precondition on
describeMismatch.

And this way we'd get `runMatch` right away in the data type:

data Matcher a = Matcher {
    runMatch :: a -> Match
  , description :: String
  }