using applicative functors