首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scalacheck带有泛型的任意

Scalacheck带有泛型的任意
EN

Stack Overflow用户
提问于 2013-04-30 23:43:18
回答 2查看 1.5K关注 0票数 1

我尝试生成一个任意列表,如下所示:

代码语言:javascript
复制
scala> def validPairs[T] = Arbitrary.arbitrary[List[(T, Option[T])]] suchThat(!_.isEmpty)
<console>:8: error: could not find implicit value for parameter a: org.scalacheck.Arbitrary[List[(T, Option[T])]]
   def validPairs[T] = Arbitrary.arbitrary[List[(T, Option[T])]] suchThat(!_.isEmpty)

你知道我哪里做错了吗?使用具体类型时,我不必定义隐式参数。

代码语言:javascript
复制
scala> def validPairsString = Arbitrary.arbitrary[List[(String, Option[String])]] suchThat(!_.isEmpty)
validPairsString: org.scalacheck.Gen[List[(String, Option[String])]]

这使用的是scala 2.9.2和scalacheck 1.10.0

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-14 22:58:41

我自己遇到了这个问题,试图生成泛型属性,稍后可以为各种具体类型实例化这些属性。我发现OP的答案有点隐秘,所以我认为提供一个更详细的答案会更好。我先慢慢地重复OP的答案。然后说明这同样适用于使用scalacheck编写属性。

关键问题是以下代码不能编译(我简化了OP给出的问题):

代码语言:javascript
复制
def validPair[T] = Arbitrary.arbitrary[(T,T)]

使用现代的Scala编译器,您会得到不同的错误消息:

代码语言:javascript
复制
diverging implicit expansion for type org.scalacheck.Arbitrary[(T, T)]
starting with method arbTuple2 in trait ArbitraryArities

(这是为了帮助那些今天用谷歌搜索这个问题的人)。

将类型参数绑定到任意类型就足够了(在快速阅读时,OP的答案有点晦涩):

代码语言:javascript
复制
def validPair[T :Arbitrary] = Arbitrary.arbitrary[(T,T)]

现在,如果您正在定义泛型属性,则需要执行相同的操作。下面是么半群的结合性公理的一个例子:

代码语言:javascript
复制
def associative[A :Arbitrary] (m: Monoid[A]) :Prop =
  forAll ( (a1: A, a2: A, a3: A) => m.op(m.op(a1,a2), a3) == m.op(a1,m.op(a2,a3)) )

它产生了一个类似的错误,没有A到任意的界限。我希望其他开始使用scalacheck编写他们的第一个泛型属性的人会发现这很有用。

票数 2
EN

Stack Overflow用户

发布于 2013-05-16 00:59:41

在不同的列表中找到了答案: def validPairsT : Arbitrary = ...(告诉它您将提供一种(可能是隐式的)方法来生成T。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16303836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档