2016-10-04 12 views
2

私はSTモナドでランダムな値をサンプリングするには?

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

その後、RVarモナド

ranfu :: RVar Bool 

内のランダム値発生器と、(例えば)にトラバーサルのいくつかの種類を行う高次機能STモナドを持っている場合はどのように私ができますこのトラバーサルのループでranfuを使用しますか? RVarの状態をSTRefにする必要がありますか、それとも良い方法がありますか?

+0

うーん、あなたが何を考えている「より良い方法」?私が心配している限り、ST自体に本質的にランダムなものは何もありません。 AFAIKには 'RVal'を"解凍 "する3つの方法があり、それらは' runRVar'、 'sampleRVar'と' sampleState'です。あなたの 'ST'が何らかの形で' MonadRandom'インスタンスを提供できれば、第2のインスタンスを使うことができます。 –

+1

私はこれが合法であるとは思わないでしょう。 'ST'はあなたがそれを実行した後に決定的になるはずです。ランダム性はそれに違反します。 –

+1

@LouisWassermanもちろん最初に何かを導入する必要があります。それ以降は完全に確定的です。 – leftaroundabout

答えて

1

最も簡単な方法は、Data.Random.Source.MWCSTためRandomSourceインスタンスを使用することが考えられます:

import Data.Random.Source.MWC 

sample :: [Bool] 
sample = runST $ do 
    g <- create 
    stTrav (\i -> runRVar ranfu g) 
関連する問題