System.Random について調べるコードを考えてみよう。 0から9までのランダムな整数を繰り返し生成するとき、最初に5が現れるのが何回目か知りたいとする。 System.Random には randomRs という関数があり、型と範囲と乱数生成器を指定すると、ランダムな値の無限リストに評価される。 この関数とリストを操作する関数を使えば、下記のようにすっきり記述できる。 場合によってはこれで十分だろう。ただ、処理効率や可読性の面で、より手続き型に近い記述にしたい場面がありそうだ。 count :: R.RandomGen g => g -> Int -> Int count g n = length $ takeWhile (/=n) $ R.randomRs (0::Int,9) g -- -- trace version -- count' :: R.RandomGen g =