scala - scala 中的类型不匹配错误以供理解

标签 scala scalacheck

我正在为以下 ADT 编写生成器。想法是用随机数据生成 block 。我在 blockGen 方法中遇到编译器错误类型不匹配:预期:Seq[Field],实际:Gen[Field]。我做错了什么?

编辑

错误出在该方法最后一行的fields,即yield Block(id, fields)

def blockGen(b: Block): Gen[Block] = for {
    id <- b.blockId
    fields <- b.fields.map(f => fieldGen(f))
} yield Block(id, fields)

ADT

trait Data {}

trait Field extends Data {
  val name: String
  val value: String
}

case class StringField(name: String, value: String) extends Field
case class NumberField(name: String, value: String) extends Field
case class Block(blockId: Field, fields: Seq[Field]) extends Data

发电机

def blockGen(b: Block): Gen[Block] = for {
    id <- b.blockId
    fields <- b.fields.map(f => fieldGen(f))
  } yield Block(id, fields)

def fieldGen(fieldType: Field): Gen[Field] = {
    for {
      f <-
      fieldType match {
        case _: NumberField => numGen
        case _: StringField => strGen
      }
    } yield f
  }

val strGen: Gen[StringField] = for {
    name <- Gen.identifier
    value <- Gen.alphaStr
  } yield StringField(name, value)

val numGen: Gen[NumberField] = for {
    name <- Gen.identifier
    value <- Gen.numStr
  } yield NumberField(name, value)

最佳答案

这是由于:fieldGen(f)返回类型是Gen[Field],但是您的Block fields 类型是 Seq[Field],因此编译器会抛出类型不匹配

解决方案:

  1. def fieldGen(fieldType: Field): Gen[Field] 更改为 def fieldGen(fieldType: Field): Seq[Field],或更改 Block 字段类型为 Gen[Feild]
  2. 创建 GenSeq 的隐式转换,例如:

    implicit def genToSeq[T](s: Gen[T]): Seq[T] = ??? // implementation conversion.
    

关于scala - scala 中的类型不匹配错误以供理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39461179/

相关文章:

Scala:我有一个 Set[X] 和函数 (X) => Future[Y] 并想输出一个 Future[Map[X, Y]]

scala - 为什么我使用自定义生成器进行的 Scalacheck 测试在丢弃许多案例后失败了,如何解决这个问题?

unit-testing - 定义一个简单的隐式任意

scala - 在 specs2 框架中,为什么使用 Scope 会阻止执行 forAll 量词?

specs2 - ScalaCheck 选择无需替换

scala - Scala 中类似 Haskell 的类型约束 trait 实现(?)

scala - 为什么创建自定义案例类的数据集时是 "Unable to find encoder for type stored in a Dataset"?

scala - 将元数据附加到 Spark 中的向量列

scala - 为什么 implicitly[ClassTag[T]] 解析成功?

scala - 正数的性质不应缩减为负数