[Haskell-cafe] How to make boolean logic with IO Monad more expressive?

Jack Kelly jack at jackkelly.name
Mon May 27 09:47:00 UTC 2019


Magicloud Magiclouds <magicloud.magiclouds at gmail.com> writes:

> With side effect, they are not the same.
> Viktor's nested-if does not trigger unnecessary IO action, while liftA2 does.

Ah, of course. Still, there's no need to restrict their type to IO; any
Monad should be fine.

-- Jack

> On Mon, May 27, 2019 at 5:38 PM Jack Kelly <jack at jackkelly.name> wrote:
>>
>> Viktor Dukhovni <ietf-dane at dukhovni.org> writes:
>>
>> >> On May 27, 2019, at 1:07 AM, Magicloud Magiclouds <magicloud.magiclouds at gmail.com> wrote:
>> >>
>> >> ```
>> >> status <- ioOperation -- IO-ed anyway
>> >> return $ pureComputing || (status && pure2)
>> >> ```
>> >
>> > With two helpers:
>> >
>> >   (<&&>) :: IO Bool -> IO Bool -> IO Bool
>> >   (<&&>) ma mb = ma >>= (\a -> if not a then return False else mb)
>> >
>> >   (<||>) :: IO Bool -> IO Bool -> IO Bool
>> >   (<||>) ma mb = ma >>= (\a -> if a then return True else mb)
>>
>> These generalise to any Applicative, I think:
>>
>> import Control.Applicative (liftA2)
>>
>> (<&&>) = liftA2 (&&)
>> (<||>) = liftA2 (||)


More information about the Haskell-Cafe mailing list