2016-09-13 5 views
3

Я пишу генераторы для следующих 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) 
+0

Что линия генерируя это сообщение? (Действительно, очевидно, что вопрос заключается в том, что идентификатор имеет несоответствие типа) – GreenAsJade

+0

@GreenAsJade добавить строку нарушения. См. Раздел EDIT –

+1

'fields' является _element_ of' Seq [Gen [Field]] ', то есть' Gen [Field] ', в то время как конструктор' Block' ожидает 'Seq [Field]' –

ответ

4

Это вызвано: fieldGen(f) возвращаемый тип Gen[Field], но ваш Blockfields тип Seq[Field], поэтому компилятор броска type mismatch.

Решение:

  1. изменение def fieldGen(fieldType: Field): Gen[Field] в def fieldGen(fieldType: Field): Seq[Field] или изменить Block тип полей для Gen[Feild]
  2. создать неявное преобразование для Gen в Seq, как:

    implicit def genToSeq[T](s: Gen[T]): Seq[T] = ??? // implementation conversion. 
    
Смежные вопросы