[Haskell-cafe] Another point-free question (>>=, join, ap)

Jeremy Shaw jeremy at n-heptane.com
Thu Feb 12 19:27:15 EST 2009


oops, I take that back. It only appears to work if you are sloppy:

x :: (Monad m) => m a
x = undefined

y :: (Monad m) => m b
y = undefined

g :: (Monad m) => a -> b -> m c
g = undefined

ex1 :: (Monad m) :: m c
ex1 = (g =<< x) =<< y

But, if you try to pin down the types you find it only works because
they are not all the same Monad m.

a :: (Int -> Int)
a = return 1

b :: Maybe Int
b = Just 2

h :: Int -> Int -> Maybe Int
h a b = return (a + b)

ex5 :: Maybe Int
ex5 = (h =<< a) =<< b

:)

j.



At Thu, 12 Feb 2009 18:04:45 -0600,
Jeremy Shaw wrote:
> 
> Hello,
> 
> You could do:
> 
>    (f =<< x) =<< y
> 
> ?
> 
> - jeremy
> 
> 
> 
> At Thu, 12 Feb 2009 23:36:19 +0000,
> Edsko de Vries wrote:
> > 
> > Hi,
> > 
> > I can desugar
> > 
> >   do x' <- x
> >      f x'
> > 
> > as
> > 
> >   x >>= \x -> f x'
> > 
> > which is clearly the same as
> > 
> >   x >>= f
> > 
> > However, now consider
> > 
> >   do x' <- x
> >      y' <- y
> >      f x' y'
> > 
> > desugared, this is
> > 
> >   x >>= \x -> y >>= \y' -> f x' y'
> > 
> > I can simplify the second half to
> > 
> >   x >>= \x -> y >>= f x'
> >  
> > but now we are stuck. I feel it should be possible to write something like
> > 
> >   x ... y ... f 
> > 
> > or perhaps
> > 
> >   f ... x ... y
> > 
> > the best I could come up with was
> > 
> >   join $ return f `ap` x `ap` y
> > 
> > which is not terrible but quite as easy as I feel this should be. Any hints?
> > 
> > Edsko
> > _______________________________________________
> > Haskell-Cafe mailing list
> > Haskell-Cafe at haskell.org
> > http://www.haskell.org/mailman/listinfo/haskell-cafe
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe


More information about the Haskell-Cafe mailing list