2016-10-04 64 views
2

如果我在RVar單子如何在ST monad中抽樣隨機值?

ranfu :: RVar Bool 

一個隨機值發生器,做某種遍歷的(比如)一個高階函數的ST單子

stTrav :: PrimMonad m => (Int -> m b) -> m [b] 

那麼我怎麼會在遍歷的循環中使用ranfu?我是否需要通過STRef來傳達RVar的狀態,還是有更好的方法?

+0

嗯,什麼是「更好的方式」是怎麼想的?就我而言,「ST」本身沒有固有的隨機性。 AFAIK有三種方法可以「解壓縮」RVal,這些方法是「runRVar」,「sampleRVar」和「sampleState」。如果你的'ST'可以以某種方式提供'MonadRandom'實例,你可以使用第二個。 –

+1

我不希望這是合法的。運行後,'ST'應該是確定性的;隨機性違反了這一點。 –

+1

@LouisWasserman當然你首先需要引入一個種子,然後它是完全確定性的。 – leftaroundabout

回答

1

最簡單的方法可能是使用STRandomSource比如在Data.Random.Source.MWC

import Data.Random.Source.MWC 

sample :: [Bool] 
sample = runST $ do 
    g <- create 
    stTrav (\i -> runRVar ranfu g)