在 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]
,但是你的Block
fields
类型是Seq[Field]
,所以编译器扔 type mismatch
.
解决方案:
- 将
def fieldGen(fieldType: Field): Gen[Field]
更改为 def fieldGen(fieldType: Field): Seq[Field]
,或将 Block
字段类型更改为 Gen[Feild]
为 Gen
到 Seq
创建隐式转换,例如:
implicit def genToSeq[T](s: Gen[T]): Seq[T] = ??? // implementation conversion.
我正在为以下 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]
,但是你的Block
fields
类型是Seq[Field]
,所以编译器扔 type mismatch
.
解决方案:
- 将
def fieldGen(fieldType: Field): Gen[Field]
更改为def fieldGen(fieldType: Field): Seq[Field]
,或将Block
字段类型更改为Gen[Feild]
为
Gen
到Seq
创建隐式转换,例如:implicit def genToSeq[T](s: Gen[T]): Seq[T] = ??? // implementation conversion.