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
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to