2016-09-13 4 views
3

다음 ADT 용 생성기를 쓰고 있습니다. 아이디어는 무작위 데이터로 블록을 생성하는 것입니다. blockGen 메서드에 컴파일러 오류 Type mismatch: expected: Seq[Field], actual:Gen[Field]이 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?이해를위한 스칼라의 형식 불일치 오류

EDIT

오류 즉 yield Block(id, fields)이 방법의 마지막 줄에 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는 잘못된 라인을 추가합니다. 편집 섹션을 참조하십시오 –

+1

'필드'는'Seq [Gen [필드]]'의 요소, 즉'Gen [필드]'이고,'블록'생성자는'Seq [필드]' –

답변

4

이 발생합니다 : fieldGen(f) 반환 형식이 Gen[Field]이지만, 당신의 Blockfields 유형은 Seq[Field], 그래서 컴파일러 던져 type mismatch.

솔루션 :

  1. 변화 def fieldGen(fieldType: Field): Gen[Field]def fieldGen(fieldType: Field): Seq[Field], 또는 Block 필드처럼 SeqGen에 대한 암시 적 변환을 만들 Gen[Feild]
  2. 에 입력 변경 : 무엇 라인은

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