[GHC] #9612: Use functional dependencies to give more specific error messages

GHC ghc-devs at haskell.org
Fri Sep 19 04:01:22 UTC 2014


#9612: Use functional dependencies to give more specific error messages
-------------------------------------+-------------------------------------
       Reporter:  rwbarton           |                   Owner:
           Type:  feature request    |                  Status:  new
       Priority:  normal             |               Milestone:
      Component:  Compiler (Type     |                 Version:  7.8.3
  checker)                           |        Operating System:
       Keywords:                     |  Unknown/Multiple
   Architecture:  Unknown/Multiple   |         Type of failure:
     Difficulty:  Unknown            |  None/Unknown
     Blocked By:                     |               Test Case:
Related Tickets:                     |                Blocking:
                                     |  Differential Revisions:
-------------------------------------+-------------------------------------
 An example from
 http://www.reddit.com/r/haskell/comments/2gryy8/stdlib_monad_error_messages_unhelpful/:

 {{{#!hs
 f ::(Eq a) => a -> (Int, a) -> Writer [(Int, a)] (Int, a)
 f y (n,x) | y == x    = return (n+1, x)
           | otherwise = do tell (n,x)
                            return (1,y)
 }}}

 {{{
     Could not deduce (MonadWriter
                         (Int, a) (WriterT [(Int, a)]
 Data.Functor.Identity.Identity))
       arising from a use of ‘tell’
     from the context (Eq a)
       bound by the type signature for
                  f :: Eq a => a -> (Int, a) -> Writer [(Int, a)] (Int, a)
       at 180.hs:42:5-57
     In a stmt of a 'do' block: tell (n, x)
     In the expression:
       do { tell (n, x);
            return (1, y) }
     In an equation for ‘f’:
         f y (n, x)
           | y == x = return (n + 1, x)
           | otherwise
           = do { tell (n, x);
                  return (1, y) }
 }}}

 GHC could realize that the class `MonadWriter m w` has a functional
 dependency `w -> m` and notice that there is an instance `MonadWriter w
 (WriterT w m1)` whose `m`-part unifies with that of the needed constraint.
 Therefore the error cannot be a missing instance, and GHC could give a
 more friendly error message like
 {{{
     Couldn't match expected type `[(Int, a)]'
         with actual type `(Int, a)'
     when unifying the instance `MonadWriter w (WriterT w m1)'
     with the constraint `MonadWriter (Int, a) (WriterT [(Int, a)]
 Identity)'
     arising from a use of 'tell'
     In a stmt of a 'do' block: tell (n, x)
     In the expression:
       ...
 }}}

 (Or, if necessary, `Could not deduce [(Int, a)] ~ (Int, a) from the
 context (Eq a) ...`)

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9612>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list