{-# LANGUAGE NoMonomorphismRestriction #-} import Control.Monad.ST import Control.Monad.ST.Unsafe import Data.VCDIFF import qualified Data.ByteString as B step2 = undefined step1 = do xs <- unsafeInterleaveST $ step2 return $ 3 : xs test f = do xs <- f $ step2 return $ 3 : xs test2 f = withByteString B.empty $ \_ _ -> do xs <- f $ step2 return $ 3 : xs main = do let xs = runST step1 ys = runST (test id) zs = runST (test unsafeInterleaveST) vs = runST (test2 unsafeInterleaveST) print $ take 1 xs -- print $ take 1 ys print $ take 1 zs print $ take 1 vs