- 上記が回ったところで、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
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なので、値を見せろ、といわれるまで評価しない、ということを反映しているのだろう