[Haskell-cafe] Equivalent of if/then/else for IO Bool?

Conor McBride ctm at cs.nott.ac.uk
Fri Nov 24 05:23:59 EST 2006


Jason Dagit wrote:
> On 11/23/06, Conor McBride <ctm at cs.nott.ac.uk> wrote:
>>
>> *Grr> ifM (Just True) (Just 3) Nothing
>> Nothing
>>
>> More care required!
>
> Thank you.  Now that you point this out I recall that I've made this
> mistake in the past 

You and me both. It's really insidious and can hide for weeks, looking 
perfectly innocent and
doing all sorts of mad stuff.

Ross and I talk about this issue in our 'Applicative' paper. It's really 
what distinguishes monads from applicative functors. Monads let you use 
the value from one computation to choose which *computation* to run 
next; applicative functors fix the structure of computations but allow 
you to do what you like with the *values*.

So, again, I know it's not going to happen in the immediate future, but 
I hope we will eventually adopt Ashley's Functor Hierarchy proposal, 
then shift the liftM family to the Applicative layer, where they belong. 
The fact that the above ifM can be typed with Applicative m, not just 
Monad m, is the clue to why it is broken.

All the best

Conor



More information about the Haskell-Cafe mailing list