[英]How does IO monad work in System.Random
import System.Random
main = do
g <- newStdGen
a <-take 5 (randoms g :: [Double])
return ()
所以这段代码不起作用,因为显然我分配的是一个类型[Double]而不是IO [Double],但我认为你无法逃脱IO? 那么为什么我似乎从IO中逃脱了,即使g是IO类型? 我仍然对IO monads如何在内部工作表示困惑感到困惑。
你不能逃避IO
,但在一个do
块内你实际上do
没有逃避 。
松散地:当你在do
块中写g <- newStdGen
时,你可以在块中稍后使用g
,就好像它只有类型StdGen
,而不是IO StdGen
。 在块结束时,无论您返回什么内容都将被包装回IO
。
使用let a =
而不是a <-
因为RHS是纯值。
import System.Random
main = do
g <- newStdGen
let a = take 5 (randoms g :: [Double])
print a
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.