【问题标题】:How to express "implies" in ScalaCheck, say, "if an integer n * n = 0 then n = 0"?如何在 ScalaCheck 中表达“暗示”,例如“如果整数 n * n = 0 则 n = 0”?
【发布时间】:2021-07-25 16:30:20
【问题描述】:

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

if an integer n * n = 0 then n = 0 

如何在 ScalaCheck 中编写此属性?我知道例如

val myprop = forAll {(n: Int) => n + 1 - 1 = n}

但我不知道如何在 ScalaCheck 中表达“A 蕴含 B”(没有将其简化为 Not-A 或 B,这看起来很笨拙)。

【问题讨论】:

  • 这不行吗? forAll {(n: Int) => n * n == 0 && n == 0}
  • 或者:forAll { (n: Int) => if (n * n == 0) n == 0 else true }。如果您想表达“当且仅当”属性,可以将其表达为 forAll { (n: Int) => (n * n == 0) == (n == 0) }

标签: scala syntax scalacheck


【解决方案1】:

使用==>(隐含运算符)

val prop = forAll { n: Int =>
  (n * n == 0) ==> n == 0
}

(见他们的User Guide) 问题是:在这个特定的例子中,条件很难满足,所以 ScalaCheck 会在几次尝试后放弃(但至少它确实告诉你,否则你会得到误报,因为你的必要条件从未被检查过)。在这种情况下,您可以提供一个自定义生成器,以便它生成满足您条件的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 2021-03-31
    • 2011-11-18
    相关资源
    最近更新 更多