在 Scala 中键入不匹配错误以供理解

Type mismatch error in a scala for comprehension

我正在为以下 ADT 编写生成器。想法是用随机数据生成块。我在 blockGen 方法中遇到编译器错误 Type mismatch: expected: Seq[Field], actual: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)return类型是Gen[Field],但是你的Blockfields类型是Seq[Field],所以编译器扔 type mismatch.

解决方案:

  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.