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


Twan

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to