如何表达;暗指;在ScalaCheck中,说“是”;如果整数n*n=0,那么n=0;?

如何表达;暗指;在ScalaCheck中,说“是”;如果整数n*n=0,那么n=0;?,scala,syntax,scalacheck,Scala,Syntax,Scalacheck,我想使用Scala的基于属性的测试工具ScalaCheck来表示属性 if an integer n * n = 0 then n = 0 如何在ScalaCheck中写入此属性?例如,我知道 val myprop = forAll {(n: Int) => n + 1 - 1 = n} 但我不知道如何在ScalaCheck中表达“A意味着B”(而不是将其简化为非A或B,这可能看起来很笨拙)。使用==>(暗示运算符) val prop=forAll{n:Int=> (n*n==0)=

我想使用Scala的基于属性的测试工具ScalaCheck来表示属性

if an integer n * n = 0 then n = 0 
如何在ScalaCheck中写入此属性?例如,我知道

val myprop = forAll {(n: Int) => n + 1 - 1 = n}
但我不知道如何在ScalaCheck中表达“A意味着B”(而不是将其简化为非A或B,这可能看起来很笨拙)。

使用
==>
(暗示运算符)

val prop=forAll{n:Int=>
(n*n==0)=>n==0
}
(见其附件)
问题是:在这个特定的例子中,条件很难满足,所以ScalaCheck会在几次尝试后放弃(但至少它确实告诉你了,否则你会得到一个假阳性,因为你的必要条件从未被检查过)。在这种情况下,您可以提供一个自定义生成器,以便它生成满足您条件的值。

这不起作用吗
forAll{(n:Int)=>n*n==0&&n==0}
或者:
forAll{(n:Int)=>if(n*n==0)n==0 else true}
。如果您想表达一个“If and only If”属性,您可以将其表示为
forAll{(n:Int)=>(n*n==0)==(n==0)}