You Could Have Invented Monads! (And Maybe You Already Have.)
f :: a -> b
f' :: a -> m a
unit :: a -> m a
f' * g' = (bind f') . (bind g')
bind f xs = concat (map f xs)
bind unit xs = concat (map unit xs)
unit x = [x]
bind unit xs
= concat (map unit xs)
= concat (map unit [x1, x2, ...])
= concat [unit x1, unit x2, ...]
= concat [[x1], [x2], ...]
= [x1, x2, ...]
= xs
f' = lift f
lift f = unit . f
unit
(or return
) can directly act on an ordinary value only, but not on a monadic value. To act on a monadic value, you need to bind
it.
How come we do not need to lift return
?
f :: a -> b
liftM :: Monad m => (a -> b) -> m a -> m b
return :: a -> m a
(liftM f) :: m a -> m b
(>>=) :: Monad m => m a -> (a -> m b) -> m b
lifeM
cannot be applied to return
at all.
unit
(or return
) is neither a pure function nor a monadic function. Instead, it is an half-monadic function, meaning that while its input is an ordinary value, its output is a monadic value.
(bind return xs) -> ys
(bind return)
applies to xs
.
return
applies to x
.
liftM
is merely fmap
implemented with (>>=)
and return
…
— Wikibooks on Haskell/Understanding monads
— Me@2016-01-26 03:05:50 PM
2016.01.30 Saturday (c) All rights reserved by ACHK