2015年6月18日木曜日

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

リスト8-3を少し確認してみた。
  def randomStream[A](g: Gen[A])(rng: RNG): Stream[A] =
    Stream.unfold(rng)(rng => Some(g.sample.run(rng)))

  def forAll[A](as: Gen[A])(f: A => Boolean): Prop = Prop {
    (n,rng) => randomStream(as)(rng).zip(Stream.from(0)).take(n).map {
      case (a, i) => try {
        if (f(a)) Passed else Falsified(a.toString, i)
      } catch { case e: Exception => Falsified(buildMsg(a, e), i) }
    }.find(_.isFalsified).getOrElse(Passed)
  }

 randomStream(as)(rng).zip(Stream.from(0)).take(n)の部分で、(a,i)のストリームをn個 生成
するようだ。
 その後、PassedかFalsifiedにmapするということか。
 .find(_.isFalsified).getOrElse(Passed)では、最初に失敗にぶつかるとそこでストップ?

  def buildMsg[A](s: A, e: Exception): String =
    s"test case: $s\n" +
    s"generated an exception: ${e.getMessage}\n" +
    s"stack trace:\n ${e.getStackTrace.mkString("\n")}"

0 件のコメント:

コメントを投稿