, ap :: Monad m => m (a -> b) -> m a -> m b
m
(->) r
, . ap
[]:
ap m1 m2 = do
x1 <- m1
x2 <- m2
return (x1 x2)
, , :
ap m1 m2 = m1 >>= (\x1 -> m2 >>= return . x1)
>>=
(->) r
[]:
instance Monad ((->) r) where
f >>= k = \ r -> k (f r) r
return = const
(return
pure
, const
).
, , :
ap f g = f >>= (\x1 -> g >>= const . x1)
= f >>= (\x1 -> (\r -> (const . x1) (g r) r))
= \x -> (\x1 -> (\r -> (const . x1) (g r) r)) (f x) x
- (x1
is (f x)
):
ap f g = \x -> (\r -> (const . (f x)) (g r) r) x
- (r
- x
):
ap f g = \x -> (const . (f x)) (g x) x
const
\c _ -> c
(.)
f . g
`\ z → f (g z):
ap f g = \x -> ((\c _ -> c) . (f x)) (g x) x
= \x -> (\z -> (\c _ -> c) ((f x) z)) (g x) x
- (z
is (g x)
, c
- ((f x) (g x))
):
ap f g = \x -> ((\c _ -> c) ((f x) (g x))) x
= \x -> (\_ -> ((f x) (g x))) x
, - (_
is x
):
ap f g = \x -> ((f x) (g x))
x
:
ap f g x = (f x) (g x)
Haskell f x y
(f x) y
, , :
ap f g x = (f x) (g x)
= f x (g x)
.