import System.Random
main = do
g <- newStdGen
a <-take 5 (randoms g :: [Double])
return()
所以,這段代碼不起作用,因爲顯然我分配給一個類型[雙]而不是IO [雙],但我認爲你不能從有史以來從IO逃脫?那麼,即使g是IO型,我又怎麼會從IO中脫身?我仍然困惑於IO monad如何在裏面工作。IO monad如何在System.Random中工作
import System.Random
main = do
g <- newStdGen
a <-take 5 (randoms g :: [Double])
return()
所以,這段代碼不起作用,因爲顯然我分配給一個類型[雙]而不是IO [雙],但我認爲你不能從有史以來從IO逃脫?那麼,即使g是IO型,我又怎麼會從IO中脫身?我仍然困惑於IO monad如何在裏面工作。IO monad如何在System.Random中工作
不能從IO
逃避,而是一個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
檢查'g'的類型! 'g < - newStdGen'':輸入g'生成'g :: StdGen'。你無法逃避,但你可以獲得價值並執行純粹的計算。 –
但是爲什麼第二行(在做)編譯 – davik
第二行不能編譯,因爲'take 5(randoms g :: [Double])'不會返回'IO'(或* monadic *)值。如果將行更改爲'let a = take 5(randoms g :: [Double])',那麼它應該編譯好。 – jtobin