Yitzchak Gale wrote:

In the following, why does testA work and testB diverge?
Where is the strictness coming from?

My guess: from strict pattern matching in (>>=).

The following StateT variant uses lazy (irrefutable) pattern match instead.

Regards,
Roberto Zunino.

====
newtype StT s m a = StT { runStT :: s -> m (a,s) }

instance (Monad m) => Monad (StT s m) where
        return a = StT $ \s -> return (a, s)
        m >>= k  = StT $ \s -> do
                -- was: (a, s') <- runStT m s
                ~(a, s') <- runStT m s
                runStT (k a) s'
        fail str = StT $ \_ -> fail str

stGet :: Monad m => StT s m s
stGet = StT $ \s -> return (s,s)

stPut :: Monad m => s -> StT s m ()
stPut s = StT $ \_ -> return ((),s)

evalStT :: Monad m => StT s m a -> s -> m a
evalStT m s = do (x,_) <- runStT m s ; return x

repeatM :: Monad m => m a -> m [a]
repeatM = sequence . repeat

testC =
  take 5 $
  runIdentity $
  flip evalStT [1..10] $ repeatM $ do
    s <- stGet
    let x = head s
    stPut $ tail s
    return x
====
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to