Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://angg.twu.net/HASKELL/Applicative1.hs.html -- http://angg.twu.net/HASKELL/Applicative1.hs -- (find-angg "HASKELL/Applicative1.hs") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- (defun e () (interactive) (find-angg "HASKELL/Applicative1.hs")) -- (find-es "haskell" "applicative") -- (find-es "haskell" "Prelude") -- (find-es "haskell" "InstanceSigns") -- (find-books "__comp/__comp.el" "haskell-hutton") -- (find-books "__comp/__comp.el" "haskell-hutton" "Applicatives") -- https://www.staff.city.ac.uk/~ross/papers/Applicative.pdf -- https://www.staff.city.ac.uk/~ross/papers/Applicative.html -- (find-huttonbookpage 182 "12.1 Functors") -- (find-huttonbooktext 182 "12.1 Functors") -- (find-ghcbasefile "Data/Functor.hs") -- (find-ghcbasefile "Data/Functor.hs" "An infix synonym for 'fmap'") -- -- class Functor f where -- fmap :: (a -> b) -> f a -> f b -- (find-huttonbookpage 187 "12.2 Applicatives") -- (find-huttonbooktext 187 "12.2 Applicatives") -- (find-ghcbasefile "Control/Applicative.hs") -- -- class Functor f => Applicative f where -- pure :: a -> f a -- (<*>) :: f (a -> b) -> f a -> f b -- -- fmap0 :: a -> f a -- fmap0 = pure -- -- fmap1 :: (a -> b) -> f a -> f b -- fmap1 g x = pure g <*> x -- -- fmap1 g x = pure g <*> x -- ==== === ==== === -- a->b f a a->b f a -- ========== ========= -- f a->f b f(a->b) -- =============== ================= -- f b f b -- -- fmap2 :: (a -> b -> c) -> f a -> f b -> f c -- fmap2 g x y = pure g <*> x <*> y -- -- fmap2 g x y = pure g <*> x <*> y -- ======= === === ======= === === -- a->b->c f a f b a->b->c f a f b -- ============= ============ -- f a->f b->f c f(a->b->c) -- ================= ==================== -- f b->f c f(b->c) -- ===================== ============================ -- f c f c -- -- fmap3 :: (a -> b -> c -> d) -> f a -> f b -> f c -> f d -- fmap3 g x y z = pure g <*> x <*> y <*> z -- -- fmap3 g x y z = pure g <*> x <*> y <*> z -- ========== === === === ========== === === === -- a->b->c->d f a f b f c a->b->c->d f a f b f c -- ================== =============== -- f a->f b->f c->f d f(a->b->c->d) -- ====================== ======================= -- f b ->f c-> f d f(b->c->d) -- ========================== ============================== -- f c->f d f(c->d) -- ============================== ===================================== -- f d f d -- (find-huttonbookpage 193 "12.3 Monads") -- (find-huttonbooktext 193 "12.3 Monads") -- -- class Applicative m => Monad m where -- return :: a -> m a -- (>>=) :: m a -> (a -> m b) -> m b -- return = pure -- liftM f mx == mx >>= \x -> return ( f x) -- ==== === === = ==== = -- a->b m a m a a a->b a -- ====== -- b -- =============== -- m b -- ===================== -- a->m b -- ============================= -- m b f <$> mx ={synonym}= fmap f mx ={law}= liftM f mx ={definition}= mx >>= \x -> return (f x) to simplify the `m1 >>= \x1 -> return (f x0 x1)' to `f x0 <$> m1') f <$> mx = fmap f mx = liftM f mx = mx >>= \x -> return (f x) = m1 >>= \x1 -> return (f x0 x1) fmap :: (a -> b) -> (f a -> f b) (<$>) = fmap (<$> mx) = \ f -> fmap f mx ==== ==== === a->b a->b ma ============= m b <ski> mf `ap` mx = mf >>= \f -> f <$> mx = mf >>= (<$> mx) mf `ap` mx = ap mf mx = (<*>) mf mx = mf >>= \f -> f <$> mx = mf >>= (<$> mx) (find-ghcbasefile "GHC/Base.hs" "Promote a function to a monad") (find-ghcbasefile "GHC/Base.hs" "Promote a function to a monad" "liftM2") (find-ghcbasefile "GHC/Base.hs" "(<*>) = liftA2 id") <lambdabot> ap = liftM2 id <hpc> bah <ski> well, i pronounce it `ap' .. for the other question, see ^ <hpc> anyhoo, ap = (<*>), so see how that's defined <ski> @src liftM2 <lambdabot> liftM2 f m1 m2 = do <lambdabot> x1 <- m1 <lambdabot> x2 <- m2 <lambdabot> return (f x1 x2) <ski> liftM2 f m0 m1 = m0 >>= \x0 -> m1 >>= \x1 -> return (f x0 x1) <ski> = m0 >>= \x0 -> (return . f x0 <$> m1) <ski> so <edrx> so that's a definition for <*>? *** chexum JOIN <edrx> I'll need some minutes to type each subexpression of that <geekosaur> use `id` for `f` <ski> er, sorry, no `return' in the last line <ski> = m0 >>= \x0 -> (f x0 <$> m1) <ski> mf `ap` mx = mf >>= \f -> f <$> mx <ski> = mf >>= (<$> mx) <ski> (i used here that `f <$> mx ={synonym}= fmap f mx ={law}= liftM f mx ={definition}= mx >>= \x -> return (f x)' to simplify the `m1 >>= \x1 -> return (f x0 x1)' to `f x0 <$> m1') -- (<*>) mf mx = mf >>= \ f -> fmap f mx -- ======= === ======= ==== ==== === -- m(a->b) m a m(a->b) a->b a->b m a -- ================ ============== -- m b m b -- ======================= -- (a->b)->m b -- ================================== -- m b -- Local Variables: -- coding: utf-8-unix -- End: