2017-02-24 3 views
0

이 암시 적 변환이 제대로 작동하는 데 문제가 있습니다. 나는이 오류가 계속 :스칼라 암시 적 변환

[error] 

found: (scala.collection.immutable.Map[O,scala.collection.immutable.Seq[D]], O) => scala.collection.immutable.Map[O,scala.collection.immutable.Seq[D]] 
required: 
(Object, Object) => Object 
    at (operToDocsMap: Map[O, Seq[D]], operator: O) => 

[error] type mismatch; 
found : Object 
required: scala.collection.immutable.Map[O,scala.collection.immutable.Seq[D]] 
at .fold(operatorToDocsMap){ 

내 코드 :이 유형의 경계에 문제가

object ModelTypes { 
    trait Document 

    trait DocumentOperator { 
    def operatesOn[D <: Document](document: D): Boolean 
    } 

    class Documents[D <: Document](docs: Seq[D]) { 
    def groupByOperator[O <: DocumentOperator](operators: Seq[O]) 
     : Map[O, Seq[D]] = { 
     docs.foldLeft(Map[O, Seq[D]]()) { 
     (operatorToDocsMap: Map[O, Seq[D]], document: D) => 
      operators 
      .filter(_.operatesOn(document)) 
      .fold(operatorToDocsMap){ 
       (operToDocsMap: Map[O, Seq[D]], operator: O) => 
       {operToDocsMap + (operator -> (document +: operToDocsMap.getOrElse(operator, Seq())))} 
      } 
     } 
    } 
    } 
    implicit def documentsConverter[D <: Document](docs: Seq[D]) = 
    new Documents(docs) 
} 

인가? 도움을 주시면 대단히 감사하겠습니다.

답변

1

다음은 요구 사항을 달성하는 데 더 관용적 인 방법입니다. 이 논리는 복잡한 네스트 된 foldJoins를 사용하지 않고 연산자와 문서를 그룹화해야합니다.

class Documents[D <: Document](docs: Seq[D]) { 
    def groupByOperator[O <: DocumentOperator](operators: Seq[O]): Map[O, Seq[D]] = { 
     val operatorDoc = 
     for { 
      doc <- docs 
      operator <- operators if operator.operatesOn(doc) 
     } yield (operator -> doc) 
     operatorDoc 
      .groupBy({ case (x, _) => x }) 
      .mapValues(_.map({ case (_, x) => x })) 
    } 
    }