
Yes, the centralisation of many type errors to TcErrors is a huge win. It would be massive task to turn *all* of GHC's errors into a data type, but the ones in TcErrors ought not to be too hard. Simon | -----Original Message----- | From: Haskell-Cafe [mailto:haskell-cafe-bounces@haskell.org] On Behalf | Of Adam Gundry | Sent: 06 February 2015 07:53 | To: Haskell Cafe | Subject: Re: [Haskell-cafe] Domain specific error messages | | [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.) | | Adam | | [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/ | _______________________________________________ | Haskell-Cafe mailing list | Haskell-Cafe@haskell.org | http://www.haskell.org/mailman/listinfo/haskell-cafe