[Haskell-cafe] Re: Math questions

Dan Doel dan.doel at gmail.com
Wed May 26 21:04:12 EDT 2010


On Wednesday 26 May 2010 5:38:57 pm Pete Chown wrote:
> test :: (Eq a) => (Int -> a) -> (Int -> a) -> Bool
> test f1 f2 = unsafePerformIO $ do
>      goodSoFar <- newIORef True
>      forLoop 1 100 $ \i ->
>        when (f1 i /= f2 i) $ writeIORef goodSoFar False
>      readIORef goodSoFar

The problem with this algorithm is that it needlessly tests f1 against f2 for 
all i, even when a non-matching value has has already been found. Using the 
power of call-with-current-continuation, I have constructed an algorithm that 
lacks this deficiency:

    import Control.Monad.Cont

    test f g = flip runCont id . callCC $ \escape ->
      do forM_ [1..100] $ \n ->
           when (f n /= g n) $
             escape False
         return True

This should perform almost 75% less work in the testFunc1 case! It certainly 
feels much snappier.

-- Dan


More information about the Haskell-Cafe mailing list