[Haskell-cafe] QuickCheck2 question

Patrick Perry patperry at gmail.com
Mon Oct 12 22:32:47 EDT 2009

I'm having some trouble with QuickCheck2 and Control.Applicative.  Specifically, I have the following functions (slightly simplified):

    copyVector :: IOVector -> Vector -> IO ()
    freezeVector :: IOVector -> IO (Vector)

I have a test, part of which looks like

    monadicIO $ do
        run $ copyVector <$> pure dst <*> freezeVector src
        -- more stuff...

When I try running the test (using test-framework-quickcheck2), the `copyVector` function never gets called.

If I re-write the test as

    monadicIO $ do
        src' <- run $ freezeVector
        run $ copyVector dst src'
        -- etc.

then everything works fine (i.e., the call to `copyVector` gets executed).  

Does anyone have any clues as to what is going on?  I suspect the problem is related to Test.QuickCheck.Monadic using `unsafePerformIO` without a `{-# NOINLINE -#}` pragma [1], but I'm not completely sure.  Adding such a pragma to `monadicIO` and `run` in Monadic.hs does not fix the problem.

I'm using Quickcheck- and GHC 6.10.1.  

Thanks in advance for any help,


[1] http://hackage.haskell.org/packages/archive/QuickCheck/

More information about the Haskell-Cafe mailing list