# Applicative functor

From HaskellWiki

An applicative functor has more structure than a functor but less than a monad. See the Haddock docs for `Control.Applicative`

.

It has turned out that many applications do not require monad functionality but only those of applicative functors. Monads allow you to run actions depending on the outcomes of earlier actions.

```
do text <- getLine
if null text
then putStrLn "You refuse to enter something?"
else putStrLn ("You entered " ++ text)
```

This is obviously necessary is some cases, but in other cases it is disadvantageous.

## Some advantages of applicative functors

- Code that uses only on the
`Applicative`

interface are more general than ones uses the`Monad`

interface, because there are more applicative functors than monads. - Programming with
`Applicative`

has a more applicative/functional feel. Especially for newbies, it may encourage functional style even when programming with effects. Monad programming with`do`

notation encourages a more sequential & imperative style.

## How to switch from monads

- Start using
`liftM`

,`liftM2`

, etc or`ap`

where you can, in place of`do`

/`(>>=)`

. - When you notice you're
*only*using those monad methods, then import`Control.Applicative`

and replace`return`

with`pure`

,`liftM`

with`(<$>)`

(or`fmap`

or`liftA`

),`liftM2`

with`liftA2`

, etc, and`ap`

with`(<*>)`

. If your function signature was`Monad m => ...`

, change to`Applicative m => ...`

(and maybe rename`m`

to`f`

or whatever).