# Exercise 6.2

`f :: a -> bf' :: a -> m aunit :: 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`