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 such as
a' <- a
b' <- b
c' <- c
someFunction a' b' c'
to the much nicer
someFunction !a !b !c
Now when I write code in Haskell, I'm looking for something similar but as far as I can tell it doesn't exist (and the bang character is obviously already used for strict pattern matching). Is there any way to avoid having a bunch of trivial left arrows inside a do block? Perhaps an extension that adds a rewriting rule, or something to that effect?
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
An alternative to @chi's answer is liftA3 someFunction a b c
(with join
if needed).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With