相关疑难解决方法(0)

Haskell的mapM不是懒惰吗?

更新:好的,这个问题可能非常简单.

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)

monads haskell lazy-evaluation

18
推荐指数
3
解决办法
2961
查看次数

标签 统计

haskell ×1

lazy-evaluation ×1

monads ×1