2017-08-25 24 views
0

この関数を作成して、(m,n)の整数乱数を生成しました。私はそれが私に与えられた範囲内でランダムに生成された値のリストを返すように、同じパラメータで、それを複数回実行したいこのような状況から、Haskellで関数を複数回実行する

giveRand :: Random c => c -> c -> c 
giveRand m n = unsafePerformIO . getStdRandom $ randomR (m,n) 

。レプリケート機能を試しましたが、giveRandの結果だけをコピーしました。関数の複数のコピーを作成して再評価しませんでした。

私は、同じパラメータで何度も何らかの関数を実行できるようにする関数があるかどうかを知りました。私はこのような場合には、範囲の同じ入力であっても、異なる値が生じる可能性があることを尋ねます。

したがって、同じパラメータで複数回関数を実行できるようにする関数がHaskellにはありますか?

+2

あなたがこれを行うには、任意の標準コンビネータを見つけることはそうだ、全部として一般的なコードは、Haskell関数が同じ引数に対して同じ結果を返すという標準的な前提のために書かれています。 'unsafePerformIO'を使って投げ捨てた機能は、「乱数の生成」を「乱数のリストを生成」に変えるコードを見つける場所です。 – Ben

+6

私はベンの指摘を二番目にします。 (私たちのBensは一緒に固執する必要があります) 'unsafePerformIO'はあなたの混乱の源です。 'unsafePerformIO'が存在することを忘れることを強くお勧めします。それは専門家のユーザーのためのものです - その名前はあなたを恐怖することです!あなたがそれを必要とする状況は確かに非常にまれであり、これはそれらの一つではありません。代わりに 'IO'型で作業する方法を学ぶ努力を費やしてください。価値があります! –

答えて

8

忘れましたunsafePerformIO;ステートフルなことをしていることを認めてください。あなたがIOをしない必要がある場合、あなたはまたStateモナドを持つステートフル性を明示することができます

Control.Monad System.Random> replicateM 3 (randomRIO (5,7)) 
[6,7,5] 

:ここではどのようだ

Control.Monad.State System.Random> runState (replicateM 3 (state (randomR (5,7)))) (mkStdGen 0) 
([7,7,5],1346387765 2103410263) 
+1

また、最終的なジェネレータの状態を気にしない場合、 'evalState'をきちんと使うことができます。これは' runState'で 'fst'と似ています。たとえば、次のようになります。 'evalState(replicateM 3(stateRandomR(5,7)))(mkStdGen 0) [7,7,5]' –

関連する問題