Re: #16362: Deriving a class via an instance that has a TypeError constraint using standalone deriving fails during compilation.

"GHC" <[email protected]>
Newsgroups gmane.comp.lang.haskell.glasgow.bugs
Message-ID <[email protected]>
#16362: Deriving a class via an instance that has a TypeError constraint using
standalone deriving fails during compilation.
-------------------------------------+-------------------------------------
        Reporter:  j9794             |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.6.3
      Resolution:                    |             Keywords:
                                     |  CustomTypeErrors
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by diatchki):

 If I understand what's going on here, the custom type errors work as
 intended.

 I think of using `TypeError` in the context of an instance declaration as
 saying "this instance does not exist".  I think it would be nicer to have
 an actual language construct to say that, but for the time being
 `TypeError` is convenient "hack" that achieves a similar result.

 So, the standalone instance in the original example has to derive and
 instance for `Num Foo` by using the non-existing instance for `NotNum
 Foo`.  As a result GHC reports that it can't do that, using the custom
 type error provided.  I think that this makes sense.

 OTOH, if you write the alternative that Ryan wrote:

 {{{
 deriving via (NotNum Foo) instance TypeError (Text "Not a num") => Num Foo
 }}}

 you are really saying that there is no instance for `Num Foo` and for the
 exact same reason that there is no instance for `NotNum Foo`.  Deriving a
 non-existing instance seems like a bit of an odd thing to do though, as
 there is nothing to derive...

 I guess it makes sense if you are trying to report a class of errors in
 the same way,
 but you could get the same by just writing the instance without deriving:
 {{{
 instance Num (NotNum Foo) => Num Foo
 }}}

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/16362#comment:6>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.