【发布时间】:2015-08-24 22:03:01
【问题描述】:
import System.Random
main = do
g <- newStdGen
a <-take 5 (randoms g :: [Double])
return ()
所以这段代码不起作用,因为显然我分配给 a 的类型是 [Double] 而不是 IO [Double] 但我认为你永远无法逃离 IO?那么,即使 g 是 IO 类型,为什么我似乎已经从 IO 中逃脱了呢?我仍然对 IO monad 在 do 表示法中的工作方式感到困惑。
【问题讨论】:
-
检查
g的类型!g <- newStdGen:type g产生g :: StdGen。你无法逃脱,但你可以获取值并执行纯粹的计算。 -
但是为什么第 2 行(在做)不编译
-
第 2 行无法编译,因为
take 5 (randoms g :: [Double])不返回IO(或 monadic)值。如果将行更改为let a = take 5 (randoms g :: [Double]),那么它应该可以编译。