[Haskell-cafe] Domain specific error messages

Adam Gundry adam at well-typed.com
Fri Feb 6 07:53:06 UTC 2015

[Re-sending to haskell-cafe since I used the wrong From address...]

This is something that has been on my mind for a while, particularly
following discussions at the last ICFP and prompted by the work on
typechecker plugins in GHC [1]. I think I see a way to proceed, though I
don't know whether I will have time to implement it for a while. I'd be
interested to hear about other approaches.

Suppose we define an ADT representation of all the typechecker error
messages, e.g. something roughly like

    data TcError = CustomError String
	         | CouldNotUnify Type Type
	         | NoClassInstance ...

In GHC all the relevant messages are generated in the
typechecker/TcErrors module, so this shouldn't be too hard to arrange.
Now we can extend plugins with the ability to supply a function

    tcPluginAdjustErrors :: [TcError] -> TcPluginM [TcError]

and run the plugged-in function between generating and reporting the
errors. Thus a library defining a DSL could also provide a plugin to
supply more informative error messages.

This is a fairly quick-and-dirty approach, because the plugin would be
quite tightly coupled to GHC, even though it could be written and
distributed separately. But it might be one way of making progress. (It
also occurs to me that such an ADT might allow GHC to define a
machine-readable serialisable format for its error messages, to allow
post-processing by external programs.)


[1] https://ghc.haskell.org/trac/ghc/wiki/Plugins/TypeChecker

On 05/02/15 09:54, Corentin Dupont wrote:
> Hi all,
> I have been very interested by this discussion when Alberto started it.
> As there been any progress?
> The problem is very acute in the Nomyx game I'm developing
> (www.nomyx.com <http://www.nomyx.com>).
> The game is based on a DSL, it's working well, but at the moment only
> expert Haskell developers can play...
> I think cryptic error messages is part of the problem.
> How to improve that?
> For example, a common error message is the following:
> Won't Compile
> <interactive>:5:28:
>     Couldn't match type ‘'NoEffect’ with ‘'Effect’
>     Expected type: Exp Effect ()
>       Actual type: Exp NoEffect ()
>     In the expression: e_1
>     In the expression: (let e_1 = do { ... } in e_1) :: Exp Effect ()
> It's not so helpful and exposing Nomyx internals. 
> A better error message would be to hint that the player forgot a "liftEffect" instruction.
> The only quick-and-dirty solution I see is to pattern-match for it and display an additional hint line...

Adam Gundry, Haskell Consultant
Well-Typed LLP, http://www.well-typed.com/

More information about the Haskell-Cafe mailing list