ScalaCheck 无法将布尔值转换为 Prop 实例
ScalaCheck can not cast boolean to Prop instance
我有以下 属性:
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.Prop 没有可用的隐式视图。
val propReversed = Prop.forAll { 列表:List[Int] =>
错误:(47, 36) 方法 forAll 的参数不足:
(隐式 p: Any => org.scalacheck.Prop, 隐式 a1: org.scalacheck.Arbitrary[List[Int]], 隐式 s1: org.scalacheck.Shrink[List[Int]], 隐式 pp1 : 列表[Int] =>
org.scalacheck.util.Pretty) org.scalacheck.Prop。未指定值参数
p, a1, s1...
val propReversed = Prop.forAll { 列表:List[Int] =>
我正在使用 ScalaCheck 版本 1.13.4
问题是您有一个 if
表达式,其真实的一面具有类型 Boolean
,而虚假的一面具有类型 Prop
。在需要 Prop
的情况下,编译器会将 propBoolean
隐式转换应用于布尔值,但像这样的条件不是这些地方之一——相反,编译器只采用最小上限Boolean
和 Prop
并使其成为 return 类型。 (也许更令人惊讶的是,即使 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(非常复杂的)语法的其他角落交互时就会崩溃时,我真的看不到做后空翻以支持稍微更简洁的用法的价值.
我有以下 属性:
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.Prop 没有可用的隐式视图。 val propReversed = Prop.forAll { 列表:List[Int] =>
错误:(47, 36) 方法 forAll 的参数不足:
(隐式 p: Any => org.scalacheck.Prop, 隐式 a1: org.scalacheck.Arbitrary[List[Int]], 隐式 s1: org.scalacheck.Shrink[List[Int]], 隐式 pp1 : 列表[Int] => org.scalacheck.util.Pretty) org.scalacheck.Prop。未指定值参数 p, a1, s1...
val propReversed = Prop.forAll { 列表:List[Int] =>
我正在使用 ScalaCheck 版本 1.13.4
问题是您有一个 if
表达式,其真实的一面具有类型 Boolean
,而虚假的一面具有类型 Prop
。在需要 Prop
的情况下,编译器会将 propBoolean
隐式转换应用于布尔值,但像这样的条件不是这些地方之一——相反,编译器只采用最小上限Boolean
和 Prop
并使其成为 return 类型。 (也许更令人惊讶的是,即使 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(非常复杂的)语法的其他角落交互时就会崩溃时,我真的看不到做后空翻以支持稍微更简洁的用法的价值.