我试图破译这实际意味着什么
check { (n: Int) =>
n > 1 ==> n / 2 > 0
}
来自http://www.scalatest.org/user_guide/writing_scalacheck_style_properties
我首先想破译那个身体是否
((n: Int) => n > 1) ==> n/2 > 0
or
(n: Int) => (n > 1 ==> n/2 > 0)
它会是哪一个?我猜测后者,因为检查方法通过方法'==>'获取函数可能也会返回一个函数?
接下来,我查看https://searchcode.com/codesearch/view/12336175/
处的检查方法签名def check[A1,P](f: A1 => P)
(implicit
p: P => Prop,
a1: Arbitrary[A1], s1: Shrink[A1]
) {
check(Prop.property(f)(p, a1, s1))
}
我相信A1会是Int,除非==>返回一个函数并更改返回类型(虽然我认为有点可疑)。我不知道如何找到隐函数P => scalacheck库中的Prop。
我注意到有一个ExtendedBoolean,它有一个函数==> https://github.com/rickynils/scalacheck/blob/master/src/main/scala/org/scalacheck/Prop.scala
或许(n> 1)被转换为ExtendedBoolean,假设函数是(n:Int)=> (n> 1 ==> n / 2> 0)然后我们得到
ExtendedBoolean( n > 1 ).==>( n / 2 > 0 ) is called then.
自执行==>对于ExtendedBoolean是Prop(b)==> p,我最终得到了
Prop( n > 1 ) ==> (n / 2 > 0)
我真的很困惑,因为在名字调用中,通常会捕获值,除非此时没有n值,因为它最初是一个函数。忽略了我的困惑一秒钟,执行==>因此,支柱是
def ==>(p: => Prop): Prop = flatMap { r1 =>
if(r1.proved) p map { r2 => mergeRes(r1,r2,r2.status) }
else if(!r1.success) Prop(r1.copy(status = Undecided))
else p map { r2 => provedToTrue(mergeRes(r1,r2,r2.status)) }
}
所以,我们这样称呼这个,所以我想另一个隐含版本来支持这里
Prop( n > 1 ) ==> Prop(n / 2 > 0)
好的,flatmap是
Prop(prms => f(this(prms))(prms))
嗯,肯定有另一次转换为Prop。我开始追踪prms然后看看对象的Prop apply方法是什么
def apply(b: Boolean): Prop = if(b) proved else falsified
但我无法将b解析为true或false,因为尚未评估这些函数。这一切如何协同工作?我想我在这里几乎没有遗漏一些概念。有人可以解释一下这个吗?
答案 0 :(得分:0)
你的确是一个ScalaCheck问题,但避免整个问题的一种方法是使用ScalaTest的PropertyChecks语法而不是ScalaCheck(Checkers在ScalaTest中支持):
import org.scalatest.prop.Checkers._
check { (n: Int) =>
n > 1 ==> n / 2 > 0
}
变为:
import org.scalatest.MustMatchers._
import org.scalatest.prop.PropertyChecks._
forAll { (n: Int) =>
whenever (n > 1) {
n / 2 must be > 0
}
}