更新:好的,这个问题可能非常简单.
q <- mapM return [1..]
Run Code Online (Sandbox Code Playgroud)
为什么这永远不会回来?
mapM是不是懒得处理无限列表?
下面的代码挂起.但是,如果我用线B替换A线,它就不会再挂起了.或者,如果我在A行之前加上"splitRandom $",它也不会挂起.
Q1是:mapM不是懒惰的吗?否则,为什么用线B替换A行"修复此"代码?
Q2是:为什么前面的A行与splitRandom"解决"了这个问题?
import Control.Monad.Random
import Control.Applicative
f :: (RandomGen g) => Rand g (Double, [Double])
f = do
b <- splitRandom $ sequence $ repeat $ getRandom
c <- mapM return b -- A
-- let c = map id b -- B
a <- getRandom
return (a, c)
splitRandom :: (RandomGen g) => Rand g a -> Rand g a
splitRandom code = evalRand code <$> getSplit
t0 …Run Code Online (Sandbox Code Playgroud)