Я пишу генераторы для следующих ADT. Идея заключается в создании блоков со случайными данными. У меня ошибка компилятора Type mismatch: expected: Seq[Field], actual:Gen[Field]
в методе blockGen
. Что я делаю не так?Ошибка несоответствия типа в scala для понимания
РЕДАКТИРОВАТЬ
Ошибка с 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)
Что линия генерируя это сообщение? (Действительно, очевидно, что вопрос заключается в том, что идентификатор имеет несоответствие типа) – GreenAsJade
@GreenAsJade добавить строку нарушения. См. Раздел EDIT –
'fields' является _element_ of' Seq [Gen [Field]] ', то есть' Gen [Field] ', в то время как конструктор' Block' ожидает 'Seq [Field]' –