G
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
class GEq a b where
geq :: a -> b -> Bool
instance {-# OVERLAPPING #-} Eq a => GEq a a where
geq = (==)
instance GEq a b where
geq _ _ = False
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help
Prelude> :load GEq.hs
[1 of 1] Compiling Main ( GEq.hs, interpreted )
Ok, modules loaded: Main.
*Main> geq::a->b->Bool
<interactive>:3:1:
Overlapping instances for GEq a1 b1 arising from a use of ‘geq’
Matching instances:
instance GEq a b -- Defined at GEq.hs:9:10
instance [overlapping] Eq a => GEq a a -- Defined at GEq.hs:6:30
(The choice depends on the instantiation of ‘a1, b1’
To pick the first instance above, use IncoherentInstances
when compiling the other instance declarations)
In the expression: geq :: a -> b -> Bool
In an equation for ‘it’: it = geq :: a -> b -> Bool
*Main>
In order to
{-# LANGUAGE KindSignatures, GADTs #-}
data Dyn :: * where
Dyn :: a -> Dyn
instance Eq Dyn where
Dyn a == Dyn b = geq a b