[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
Tue May 10 20:48:19 UTC 2016
#7401: Can't derive instance for Eq when datatype has no constructor, while it is
trivial do do so.
-------------------------------------+-------------------------------------
Reporter: jpbernardy | Owner:
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.6.1
Resolution: | Keywords: deriving,
| newcomer
Operating System: Unknown/Multiple | Architecture:
Type of failure: GHC rejects | Unknown/Multiple
valid program | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s): Phab:D978
Wiki Page: |
-------------------------------------+-------------------------------------
Description changed by osa1:
@@ -1,34 +1,10 @@
- mpickering reminded me this ticket so before I leave the ownership of this
- ticket let me write down the current status:
-
- Basically there are a couple of things we can do and we just need someone
- to
- decide which one.
-
- 1. Implement {{{==}}} as {{{_ == _ = True}}}. Pro: this is consistent with
- {{{Void}}}'s {{{Eq}}} instance. Con: I think this lets some bugs to sneak
- in. I think it doesn't make sense to compute things based on equality of
- empty types, so at this point you've probably made a mistake and it's
- better to just bail out.
-
- 2. Implement {{{==}}} as `x == y = case x of {}`. Pro: it fixes the
- problem with (1) and in a good way - you've probably used something like
- {{{error "..."}}} for the empty type terms, so you get your error message.
- Con: this inconsistent with {{{Void}}}.
-
- 3. Leave this as is - no {{{deriving (Eq)}}}. This way we make the user
- decide which behaviour to have. Pro: You can have whatever you want. Con:
- Inconvenient.
-
- These were also discussed at some point but IIRC most people agree that
- these
- are bad ideas:
-
- 4. {{{x == y = error "(==) on empty type"}}}: If it's going to fail it's
- better to fail like (2).
-
- 5. {{{_ == _ = False}}}: Denotationally / type-theoretically bottoms are
- equal or something like that? So it's better to implement (1) instead.
-
- 6. Implement (2), change {{{Void}}}s instance too: Can potentially break
- code.
+ On a "phantom datatype" D, one gets the message:
+ {{{
+ Can't make a derived instance of `Eq D':
+ `D' must have at least one data constructor
+ }}}
+ However there is a trivial, correct instance of Eq D:
+ {{{
+ instance Eq D where
+ (==) = undefined
+ }}}
New description:
On a "phantom datatype" D, one gets the message:
{{{
Can't make a derived instance of `Eq D':
`D' must have at least one data constructor
}}}
However there is a trivial, correct instance of Eq D:
{{{
instance Eq D where
(==) = undefined
}}}
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/7401#comment:47>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list