[Haskell-cafe] is the evaluation order deterministic when using applicative with IO

Twan van Laarhoven twanvl at gmail.com
Fri Mar 16 12:30:13 CET 2012

On 16/03/12 10:45, Rouan van Dalen wrote:
> Hi everyone.
> I was wondering if I can make assumptions about the evaluation order of
> the following code:
> isTrue :: Int -> IO Bool
> isTrue val = pure (||) <*> boolTest1 val <*> boolTest2 val
> {- boolTest1 is an inexpensive, quick check -}
> boolTest1 :: Int -> IO Bool
> boolTest1 val = undefined
> {- boolTest2 is a very expensive check -}
> boolTest2 :: Int -> IO Bool
> boolTest2 val = undefined
> When using Applicative in the isTruefunction, I would like to make use of
> the short-circuit behaviour of || and rely on the fact that the boolTest1
> will be executed first. The reason I am asking is because the boolTest
> functions
> are in the IO monad, instead of just returning pure Bool values.

The evaluation order is always from left to right with the instance 
Applicative IO. However, both sides will still be evaluated. isTrue is 
equivalent to:

     isTrue val = do
         t1 <- boolTest1 val
         t2 <- boolTest2 val
         return (t1 || t2)

If you want to avoid the side effects of boolTest2 when boolTest1 
returns true, you will need to implement a monadic or, something like

     orM ma mb = do
         a <- ma
         if a then return True else mb


More information about the Haskell-Cafe mailing list