乱数はいつ決まる?

  • 上記が回ったところで、Main.hsをghciに読み込んで、Main.hsでやっていることを見てみる
  • Probディレクトリの中で、stack buildも終わった状態で以下をやると、Main.hsを回すのに必要なライブラリなどは揃っていて、読み込める
stack ghci
  • ghci内で、appフォルダ以下のMain.hsをロードする
:l app/Main.hs
  • Personなる、年齢、体重、給料を持つデータ型のオブジェクトを作る
    • これは具体的な値を持っている
let q1 = Person 30 60.5 1234.4
q1
Person 30 60.5 1234.4
  • person関数は引数を取らない関数(ただのオブジェクト)。そんなpersonタイプのインスタンスp1を作り、その型チェックをする
let p1 = person
:t p1
p1 :: RandT IO Person
    • このperson関数は3要素を持つPersonを RandT IO の箱で包んである
    • 特に、Personの3要素には、uniformIn関数が使ってあって、これは、『乱数を発生させるよ』という状態であって、『乱数を発生させて値を入れたよ』と放っていない
  • randomPersonsは、[Person] (Personのリスト)をIOで包んだもの
    • RandTが取れている
    • なぜかと言うと、mwc関数が
:t mwc
mwc :: RandT IO a -> IO a
    • のように、RandTを取っているから
let p2s = randomPersons 3
p2s
    • とすると、[Person 18 90.12 7234.12, Person 45 56.2 6679.23, Person 44 76.34 56742.454]のようになっている
    • もう一度p2sと打つと、Personの情報がランダムに変わって表示される
    • これは、p2sというのは、乱数発生状態ではない、という型になっているものの、実際に乱数発生はlazyなので、値を見せろ、といわれるまで評価しない、ということを反映しているのだろう