I\'ve had the luxury of learning a bit of Idris lately and one thing I\'ve found extremely convenient is the !-notation, which let\'s me shorten monadic code inside a do block s
An alternative to @chi's answer is liftA3 someFunction a b c (with join
if needed).
Since every monad is an Applicative
(with GHC >= 7.10) we can write
someFunction <$> a <*> b <*> c
Note that if someFunction
returns a monadic value of type m T
, the above will return m (m T)
, which is likely not what we want (as @pigworker points out below). We can however join
the two layers together:
join $ someFunction <$> a <*> b <*> c
Speaking of arrows...
import Control.Arrow
a' = Kleisli $ const a
b' = Kleisli $ const b
c' = Kleisli $ const c
foo = (`runKleisli`()) $
(a' &&& b') &&& c' >>> uncurry (uncurry someFunction)
Not that I recommend this.