繁体   English   中英

IO monad如何在System.Random中工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM