reflection
{-# LANGUAGE KindSignatures, GADTs #-}
data Dyn :: * where
Dyn :: a -> Dyn
How to write the correct instance Eq Dyn
, do not change data Dyn
?
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
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
instance Eq Dyn where
Dyn a == Dyn b = geq a b
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
If Haskell supports reflections like Java,