
#14004: G -------------------------------------+------------------------------------- Reporter: zaoqi | Owner: (none) Type: feature request | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.3 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by zaoqi): Replying to [comment:9 AntC]:
Hi @bgamari, I got this to work just changing the pragmas, per my comment:7. (So I editted that comment after posting.) Note there's a `Eq a =>` constraint on the `GEq a a` instance; but not on the `GEq a b`.
{{{
Dyn "hello" == Dyn "bye" ===> False Dyn "hello" == Dyn "hello" ===> True Dyn "hello" == Dyn 'b' ===> False
}}}
I agree @zaoqi's definition for `Dyn` is 'dodgy'.
{{{#!hs {-# LANGUAGE KindSignatures, GADTs #-} {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-} data Dyn :: * where Dyn :: a -> Dyn instance Eq Dyn where Dyn a == Dyn b = geq a b class GEq a b where geq :: a -> b -> Bool instance {-# OVERLAPPABLE #-} (Eq a) => GEq a a where geq = (==) instance {-# OVERLAPPING #-} GEq a b where geq _ _ = False }}} {{{ GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help Prelude> :load Dyn.hs [1 of 1] Compiling Main ( Dyn.hs, interpreted ) Ok, modules loaded: Main. *Main> Dyn () == Dyn () False }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14004#comment:10 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler