Proposal: add ifM and whenM to Control.Monad

Mario Pastorelli pastorelli.mario at gmail.com
Sun Apr 20 19:44:42 UTC 2014


+1 for unlessM

On 04/20/2014 09:38 PM, Andreas Abel wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> +1 for both, plus
>
> unlessM :: (Monad m) => m Bool -> m () -> m ()
> unlessM mc ma = ifM mc (return ()) ma
>
> (See, for instance,
> https://hackage.haskell.org/package/Agda-2.3.2.2/docs/Agda-Utils-Monad.html
> .)
>
> On 20.04.2014 21:10, Mario Pastorelli wrote:
>> I would like to propose the addition of two new combinators to
>> Control.Monad:
>>
>> ifM :: (Monad m) => m Bool -> m a -> m a -> m a whenM :: (Monad m)
>> => m Bool -> m () -> m ()
>>
>> The reason is that when you work in a `Monad m` the first argument
>> of `if` and `when` is often a `m Bool` and not a `Bool`. In those
>> cases, you have to write:
>>
>> monadicOperationReturningBool >>= \b -> when b
>> doAnotherMonadicOperation
>>
>> or
>>
>> monadicOperationReturningBool >>= flip when
>> doAnotherMonadicOperation
>>
>> to accomplish what you want to do. If you use the do-notation this
>> is less terrible but you still need to assign a name to the boolean
>> value. Take for example:
>>
>> f = do dirDoesntExist <- not <$> doesDirectoryExist path when
>> dirDoesntExist $ do putStrLn $ "Creating directory " ++ path
>> createDirectory path
>>
>> in this snippet, dirDoesntExist is completely useless and its only
>> purpose it to be used in the next expression. With the new
>> combinators you could write:
>>
>> f = whenM (not <$> doesDirectoryExists path) $ do putStrLn $
>> "Creating directory " ++ path createDirectory path
>>
>> Many libraries on hackage already include these functions (I often
>> use Control.Conditional). For a list see
>> http://holumbus.fh-wedel.de/hayoo/hayoo.html?query=whenM&start=0.
>> _______________________________________________ Libraries mailing
>> list Libraries at haskell.org
>> http://www.haskell.org/mailman/listinfo/libraries
>>
>
> - -- 
> Andreas Abel  <><      Du bist der geliebte Mensch.
>
> Department of Computer Science and Engineering
> Chalmers and Gothenburg University, Sweden
>
> andreas.abel at gu.se
> http://www2.tcs.ifi.lmu.de/~abel/
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.11 (GNU/Linux)
> Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
>
> iEYEARECAAYFAlNUIiQACgkQPMHaDxpUpLMkiQCgwwUfJ/orQ9GNB3SsStc1SB/4
> F/kAn0AZ04HBeRjlNk7QkZcjHZ6Am+37
> =EBzJ
> -----END PGP SIGNATURE-----



More information about the Libraries mailing list