2015年6月14日日曜日

scala関数型デザイン&プログラミング P161

case class Gen[A](sample:State[RNG,A])
Exercise8.4 Genの上記の表現を使って、startからstopExclusiveの範囲内の整数を生成するchooseを実装せよ
def choose(start: Int, stopExclusive: Int): Gen[Int] =
  Gen(State(RNG.nonNegativeInt).map(n => start + n % (stopExclusive-start)))
Stateの中身を忘れていて、もう一度、前のところを読み直さないとよくわからなくなっている。
Exercise6.10のmapを確認すると def map[B](f: A => B): State[S, B] ということだから
 StateのnonNegativeInt:Aが範囲内の整数:Bに変換されState[S,B]になっている。

Exercise8.5
def unit[A](a: => A): Gen[A] =
  Gen(State.unit(a))
def boolean: Gen[Boolean] =
  Gen(State(RNG.boolean))
booleanという関数が見当たらないような気がするが。。
def listOfN[A](n: Int, g: Gen[A]): Gen[List[A]] =
  Gen(State.sequence(List.fill(n)(g.sample)))

2 件のコメント:

  1. >booleanという関数が見当たらないような気がするが。。
    遅レスですが、回答ページの
    「fpinscala/exercises/src/main/scala/fpinscala/state/」のState.scalaではなく、「fpinscala/answers/src/main/scala/fpinscala/state/State.scala」に
    > def boolean(rng: RNG): (Boolean, RNG) =
    > rng.nextInt match { case (i,rng2) => (i%2==0,rng2) }
    とあります。
    問題演習では、出てきてませんが。

    返信削除
    返信
    1. 問題練習では見あたらないけど、そちらにはあったのですね。
      ありがとうございました。

      削除