2015年6月20日土曜日

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

Exercise8.13 空でないリストを生成するlistOf1を定義し、このジェネレータを利用するようにmaxの仕様を更新せよ

def listOf1[A](g: Gen[A]): SGen[List[A]] =
  SGen(n => g.listOfN(n max 1))
    最低値が0にならないようにしている?
val maxProp1 = forAll(listOf1(smallInt)) { l =>
  val max = l.max
  !l.exists(_ > max) // lの中にmaxより大きい値はないはず
}

Exercise8.14 List[Int]のソートなどに利用できるList.sortedの振る舞いを検証するためのプロパティを記述せよ。
val sortedProp = forAll(listOf(smallInt)) { ns =>
  val nss = ns.sorted
  //  どのソート済みのリストも、空か、一つの要素かで、 aがbより大きいような連続(a,b)要素ではない。
  (ns.isEmpty || nss.tail.isEmpty || !ns.zip(ns.tail).exists {
    case (a,b) => a > b
  })
    // また、ソート済みリストは入力リストの要素をすべて持っている
    && !ns.exists(!nss.contains(_))
    // また、入力リストにない要素はない。
    && !nss.exists(!ns.contains(_))
}

 !ns.zip(ns.tail).exists {  case (a,b) => a > b  } これの意味は? List(1,2,3).zip(List(2,3)はList((1,2),(2,3))つまり、リストの中から連続した2つの要素のペアを取り出すことになる。そこに、逆順の要素があればTrue、!により、false
 でも、nsは、ソート済みでないから、falseがあり得るのでないか? nsがnssなら分かるが

contains(x)はxが要素に含まれているかどうかを調べる.
 !ns.exists(!nss.contains(_))は、!ns.exists(_=>!nss.contains(_))ということで、入力リストの各要素に対して、ソート済みリストに存在しないものがあるかチェックしている。もちろんないので、falseで!により、Trueになる。ということ?

この章のこの後ののExerciseは、難易度が高く、パス

0 件のコメント:

コメントを投稿