
As usual you can check:
Prelude Control.Applicative> pure (||) <*> pure True <*> undefined
*** Exception: Prelude.undefined
Prelude Control.Applicative> (||) True undefined
True
2012/3/16 Rouan van Dalen
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 isTrue function, 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.
Regards Rouan.
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe