【问题标题】:ScalaCheck can not cast boolean to Prop instanceScalaCheck 不能将布尔值转换为 Prop 实例
【发布时间】:2017-07-16 08:25:01
【问题描述】:

我有以下属性:

import org.scalacheck.Prop.propBoolean

def elementsAreReversed(list: List[Int], reversed: List[Int]): Boolean =
  if (list.isEmpty) true else {
    val lastIdx = list.size - 1
    list.zipWithIndex.forall { case (element, index) =>
      element == reversed(lastIdx - index)
    }
  }

val propReversed = Prop.forAll { list: List[Int] =>
  val reversed = list.reverse

  if (list.isEmpty)
    list == reversed
  else {
    val hasSameSize    = reversed.size == list.size
    val hasAllElements = list.forall(reversed.contains)

    // It works until  I add a label here:
    hasSameSize && hasAllElements && elementsAreReversed(list, reversed)
  }

如果添加标签,它会中断:

    hasSameSize :| " a label which doesn't let the code compile" &&
    hasAllElements &&
    elementsAreReversed(list, reversed)

编译器给了我以下信息:

错误:(47, 36) Any => org.scalacheck.P​​rop 没有可用的隐式视图。 val propReversed = Prop.forAll { list: List[Int] =>

错误:(47, 36) forAll 方法的参数不足:

(隐式 p: Any => org.scalacheck.P​​rop, 隐式 a1: org.scalacheck.Arbitrary[List[Int]], 隐式 s1: org.scalacheck.Shrink[List[Int]], 隐式 pp1: List [整数] => org.scalacheck.util.Pretty) org.scalacheck.P​​rop。未指定的值参数 p, a1, s1...

val propReversed = Prop.forAll { list: List[Int] =>

我正在使用 ScalaCheck 版本1.13.4

【问题讨论】:

    标签: scala unit-testing scalacheck


    【解决方案1】:

    问题是你有一个if 表达式,其真面为Boolean,而假面为Prop。编译器会将 propBoolean 隐式转换应用到布尔值,以防它需要 Prop,但像这样的条件不是这些地方之一,而是编译器只需采用 Boolean 的最小上限和Prop 并使其成为返回类型。 (也许更令人惊讶的是,即使 Prop 排在第一位,Boolean 排在第二位也是如此。)

    您可以通过多种方式完成这项工作,但最简单的方法是显式应用转换:

    val propReversed = Prop.forAll { list: List[Int] =>
      val reversed = list.reverse
    
      if (list.isEmpty) Prop.propBoolean(list == reversed) else {
        val hasSameSize    = reversed.size == list.size
        val hasAllElements = list.forall(reversed.contains)
    
        hasSameSize :| " a label which doesn't let the code compile" &&
          hasAllElements && elementsAreReversed(list, reversed)
      }
    }
    

    对我来说,这只是花哨的支持隐式转换的 DSL 令人沮丧的另一个例子。我喜欢 ScalaCheck 并且每天都在使用它,但是当这些技巧开始与 Scala 的其他角落(非常复杂)的语法进行交互时就会崩溃时,我并没有真正看到做后空翻来支持更简洁的用法的价值.

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 1970-01-01
      • 2021-05-07
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 2012-02-25
      • 2015-02-20
      相关资源
      最近更新 更多