[Haskell-cafe] generalized newtype deriving allows the definition
of otherwise undefinable functions
Wolfgang Jeltsch
g9ks157k at acme.softbase.org
Tue Mar 9 04:37:50 EST 2010
Am Dienstag, 9. März 2010 07:24:35 schrieb Steffen Schuldenzucker:
> On 03/08/2010 10:45 PM, Wolfgang Jeltsch wrote:
> > The point is, of course, that such conversions are not only possible for
> > binary operations but for arbitrary values and that these conversions are
> > done by a single generic function conv. I don’t think it would be
> > possible to implement conv without generalized newtype deriving.
> >
> > Any thoughts?
>
> Hi Wolfgang,
>
> it's not exactly the same, but...
>
> > import Control.Applicative
> >
> > newtype Wrapped a = Wrap a deriving Show
> >
> > instance Functor Wrapped where
> > fmap f (Wrap x) = Wrap $ f x
> >
> > instance Applicative Wrapped where
> > pure = Wrap
> > (Wrap f) <*> (Wrap x) = Wrap $ f x
> >
> > convBinOp :: (a -> a -> a) -> (Wrapped a -> Wrapped a -> Wrapped a)
> > convBinOp op x y = pure op <*> x <*> y
I think this is fundamentally different. As I said above:
> The point is, of course, that such conversions are not only possible for
> binary operations but for arbitrary values and that these conversions are
> done by a single generic function conv.
Your applicative functor Wrapped allows conversions only for n-ary functions,
so, for example, John Meachem’s trick to break the invariant of Set doesn’t
work. On the other hand, you need a separate conversion function for each
arity (pure, fmap, liftA2, liftA3, …) whereas generalized newtype deriving
allows you to use the same conversion function for all arities.
Best wishes,
Wolfgang
More information about the Haskell-Cafe
mailing list