2015-08-24 47 views
3
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中工作

+0

檢查'g'的類型! 'g < - newStdGen'':輸入g'生成'g :: StdGen'。你無法逃避,但你可以獲得價值並執行純粹的計算。 –

+0

但是爲什麼第二行(在做)編譯 – davik

+1

第二行不能編譯,因爲'take 5(randoms g :: [Double])'不會返回'IO'(或* monadic *)值。如果將行更改爲'let a = take 5(randoms g :: [Double])',那麼它應該編譯好。 – jtobin

回答

4

不能從IO逃避,而是一個do塊內你沒有真正逃避本身。

鬆散:當你在do塊寫g <- newStdGen,然後你可以在塊中使用g以後,如果它只是有型StdGen,而不是IO StdGen。在街區盡頭,無論您返回什麼,都會被包裹在IO

2

使用let a =而不是a <-,因爲RHS是一個純粹的值。

import System.Random 

main = do 
    g <- newStdGen 
    let a = take 5 (randoms g :: [Double]) 
    print a