[GHC] #7401: Can't derive instance for Eq when datatype has no constructor, while it is trivial do do so.

GHC ghc-devs at haskell.org
Mon Jun 15 18:45:18 UTC 2015


#7401: Can't derive instance for Eq when datatype has no constructor, while it is
trivial do do so.
-------------------------------------+-------------------------------------
        Reporter:  jpbernardy        |                   Owner:  osa1
            Type:  feature request   |                  Status:  new
        Priority:  normal            |               Milestone:  7.12.1
       Component:  Compiler          |                 Version:  7.6.1
      Resolution:                    |                Keywords:  deriving,
Operating System:  Unknown/Multiple  |  newcomer
 Type of failure:  GHC rejects       |            Architecture:
  valid program                      |  Unknown/Multiple
      Blocked By:                    |               Test Case:
 Related Tickets:                    |                Blocking:
                                     |  Differential Revisions:  Phab:D978
-------------------------------------+-------------------------------------

Comment (by osa1):

 (1) and (2) are done(will push commits soon). For (3), I think it may
 break
 some things. I found this NOTE in compiler/types/TyCon.hs:

 {{{
 Note [Enumeration types]
 ~~~~~~~~~~~~~~~~~~~~~~~~
 We define datatypes with no constructors to *not* be
 enumerations; this fixes trac #2578,  Otherwise we
 end up generating an empty table for
   <mod>_<type>_closure_tbl
 which is used by tagToEnum# to map Int# to constructors
 in an enumeration. The empty table apparently upset
 the linker.

 Moreover, all the data constructor must be enumerations, meaning
 they have type  (forall abc. T a b c).  GADTs are not enumerations.
 For example consider
     data T a where
       T1 :: T Int
       T2 :: T Bool
       T3 :: T a
 What would [T1 ..] be?  [T1,T3] :: T Int? Easiest thing is to exclude
 them.
 See Trac #4528.
 }}}

 See also trac #2578.

 Relevant commits:

 {{{
 commit 409e4d9f59dece1c21434191459c96b3e355faa9
 Author: Ian Lynagh <igloo at earth.li>
 Date:   Sat Feb 27 17:24:29 2010 +0000

     Add a test for #2578

 commit a251cba370c9bfb291159c4deea20226a87eeac3
 Author: Simon Marlow <marlowsd at gmail.com>
 Date:   Mon Mar 1 09:55:25 2010 +0000

     expand comments for #2578 fix

 commit 09d2b3b2e1f9d0a4c4b938dc6ff6a0b068138445
 Author: Ian Lynagh <igloo at earth.li>
 Date:   Sat Feb 27 17:39:51 2010 +0000

     Fix trac #2578
     We define empty datatypes as not being enumerations, which means the
     empty blocks aren't generated.
 }}}

 This is the fix:

 {{{
 -  = DataTyCon { data_cons = cons, is_enum = all isNullarySrcDataCon cons
 }
 +  = DataTyCon {
 +        data_cons = cons,
 +        is_enum = -- We define datatypes with no constructors to not be
 +                  -- enumerations; this fixes trac #2578
 +                  not (null cons) &&
 +                  all isNullarySrcDataCon cons
 +    }
 }}}

 `Note [Enumeration types]` mentions some kind of linker failure related
 with
 some table(??), but I don't have a lot of ideas about what it's talking
 about.
 I don't have a Mac so I can't try with latest linker/GHC.

 Any ideas about (3)? How should we proceed?

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


More information about the ghc-tickets mailing list