problems with Control.Applicative

David Menendez zednenem at psualum.com
Thu Oct 19 22:55:29 EDT 2006


John Meacham writes:

> On Tue, Oct 17, 2006 at 11:09:00AM +0100, Ross Paterson wrote:
> > in which the left-associative <*> buries the function in the parser,
> > while you'd prefer
> > 
> >     fmap (\ ((x,y),z) -> f x y z) (p <> q <> r)
> > 
> > (where p <> q is equivalent to pure (,) <*> p <*> r)
> > so presumably you'd want <> as a method in Applicative too.
> 
> I think the main ones would be (for frisby's use):
> 
> <*
> *>
> <>
> optional

Would it help at all if liftA2 were part of the Applicative class? I've
usually defined Applicative like so,

    class Functor f => Applicative f where
        pure :: a -> f a
        (<*>) :: f (a -> b) -> f a -> f b
        liftA2 :: (a -> b -> c) -> f a -> f b -> f c
        
        (<*>) = liftA2 ($)
        liftA2 f a b = fmap f a <*> b

(The pre 6.6 arrows package defined Control.Sequence in this fashion.)

Using that, you could define 

    instance Applicative P where
        pure = P . Unit
        liftA2 f (P a) (P b) = P $ PMap (uncurry f) (Then a b)

in which case <* and *> end up the same as <<- and ->>.

-- 
David Menendez <zednenem at psualum.com> | "In this house, we obey the laws
<http://www.eyrie.org/~zednenem>      |        of thermodynamics!"


More information about the Libraries mailing list