Daryoush Mehrtash wrote:
What happens when a type adds driving such as:
newtype SupplyT s m a = SupplyT (StateT [s] m a)
deriving (Functor, Monad, MonadTrans, MonadIO)
Two questions:
How does the deriving implement the instance?
With GeneralizedNewtypeDeriving, since newtypes are just a
reinterpretation of the underlying type, the deriving clause just uses
the instance for the underlying type (massaging it with the
wrapping/unwrapping functions for the newtype). The primary use for this
is for defining a newtype on monad transformer stacks, for which it
succeeds excellently. However, if the semantics of your newtype are
different than the underlying type w.r.t. the type class, then it's not
so good.
For the more basic kind of deriving clause, the compiler knows about how
to create generic instances for obvious things, e.g. the compiler can
derive the obvious Show instance by doing introspection on the source
code. However, these derivations are limited to classes with an obvious
implementation based solely on the structure of the type definition.
--
Live well,
~wren
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe