gpt4 book ai didi

ScalaCheck 无法将 bool 值转换为 Prop 实例

转载 作者:行者123 更新时间:2023-12-05 00:52:35 28 4
gpt4 key购买 nike

我有以下属性(property):

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 中没有可用的隐式 View 。
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[Int] =>
org.scalacheck.util.Pretty) org.scalacheck.P​​rop。未指定值参数
p, a1, s1...

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

我正在使用 ScalaCheck 版本 1.13.4

最佳答案

问题是你有一个 if真边类型为 Boolean 的表达式而假面的类型是Prop .编译器将应用 propBoolean在需要 Prop 的情况下隐式转换为 bool 值,但像这样的条件不是这些地方之一——相反,编译器只是采用 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 的(极其复杂的)语法的其他角落进行交互时就会崩溃时,我并没有真正看到进行后空翻以支持更简洁的用法的值(value).

关于ScalaCheck 无法将 bool 值转换为 Prop 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42456685/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com