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 件のコメント:
コメントを投稿