2
如果我在RVar
單子如何在ST monad中抽樣隨機值?
ranfu :: RVar Bool
一個隨機值發生器,做某種遍歷的(比如)一個高階函數的ST
單子
stTrav :: PrimMonad m => (Int -> m b) -> m [b]
那麼我怎麼會在遍歷的循環中使用ranfu
?我是否需要通過STRef
來傳達RVar
的狀態,還是有更好的方法?
如果我在RVar
單子如何在ST monad中抽樣隨機值?
ranfu :: RVar Bool
一個隨機值發生器,做某種遍歷的(比如)一個高階函數的ST
單子
stTrav :: PrimMonad m => (Int -> m b) -> m [b]
那麼我怎麼會在遍歷的循環中使用ranfu
?我是否需要通過STRef
來傳達RVar
的狀態,還是有更好的方法?
最簡單的方法可能是使用ST
的RandomSource
比如在Data.Random.Source.MWC
:
import Data.Random.Source.MWC
sample :: [Bool]
sample = runST $ do
g <- create
stTrav (\i -> runRVar ranfu g)
嗯,什麼是「更好的方式」是怎麼想的?就我而言,「ST」本身沒有固有的隨機性。 AFAIK有三種方法可以「解壓縮」RVal,這些方法是「runRVar」,「sampleRVar」和「sampleState」。如果你的'ST'可以以某種方式提供'MonadRandom'實例,你可以使用第二個。 –
我不希望這是合法的。運行後,'ST'應該是確定性的;隨機性違反了這一點。 –
@LouisWasserman當然你首先需要引入一個種子,然後它是完全確定性的。 – leftaroundabout