2011-09-06 7 views
3

여기가 나의 첫 번째 질문이므로 충분한 정보를 제공하시기 바랍니다. 설명을 요청하십시오.스칼라 : 컨텍스트 바인딩을 얻는 방법 List [T] conversion working here?

작품 대가로 다음 촬영 : 코드

implicit def optionBsonReader[T, U](implicit ev: BsonReader[T, U]) = new BsonReader[Option[T], Option[U]] { 
    def read(obj: Option[U]): Option[T] = { 
    obj match { 
     case Some(x) => Some(x.fromBson[T]) 
     case None => None 
    } 
    } 
} 

이 부분은 또 다른 옵션 [T]에 BSON의 옵션 래핑 편 변환한다. 나는 동일한 목록을 위해 일 것이라고 생각하지만, 다음은 컴파일되지 않습니다 :

implicit def listBsonReader[T, DBObject](implicit ev: BsonReader[T, DBObject]) = new BsonReader[List[T], MongoCursor] { 
    def read(cur: MongoCursor): List[T] = { 
    cur.map(_.fromBson[T]).toList 
    } 
} 

나는 일반 역학에 대해 다음 코드를 사용하고 있습니다 :

package object bson { 

    def bsonReader[A, B](implicit reader: BsonReader[A, B]) = reader 
    def bsonWriter[A, B](implicit writer: BsonWriter[A, B]) = writer 

    implicit def addWriter[A](any: A): WithWriter[A] = new WithWriter(any) 
    implicit def addReader[A](any: A): WithReader[A] = new WithReader(any) 
} 

package bson { 
    private[bson] class WithWriter[A](any: A) { 
    def toBson[B](implicit writer: BsonWriter[A, B]): B = writer.write(any) 
    } 
    private [bson] class WithReader[B](any: B) { 
    def fromBson[A](implicit reader: BsonReader[A, B]): A = reader.read(any) 
    } 
} 

컴파일러 오류 : could not find implicit value for parameter reader: project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject] cur.map(_.fromBson[T]).toList

컴파일러가 fromBson이 형식을 제공하기 전에 호출되기 전에 T를 평가하려고하는 것처럼 이상하게 생각됩니다. 옵션 독자가 그런 불평이없는 것처럼 보이는 이래로 이것은 특히 이상하게 내가 나를 때린다. 필자는 최근 스칼라에서 본격적으로 코드를 작성하기 시작 했으므로 여기서 뭔가를 놓치고 있다고 확신합니다.

더 많은 정보가 필요하면 도움을 받으시겠습니까? 최고의

,

더크 당신의 listBsonReader에서

+1

뭔가가 여기에 맞지 않습니다. 따옴표 붙은 코드에 매개 변수'reader'가 없습니다. 코드 예제와 그 예제에서 발생한 정확한 오류를 알려주시겠습니까? ... 여기에 붙여 넣기 전에 편집 할 필요가 없습니다. –

+0

편집에서 추가 정보보기 – dlouwers

답변

2

이 유형에 대한 이유가 DBOBJECT에 당신의 커서 반복 처리는,지도가 DbObject => X 기능을 기대 (U)하지 있습니다. 나는 그것이 매우 일반적으로 BsonReader[T, DBObject]에서 찾고, _DBObject를 입력하여 당신이지도에서

implicit def withFromBson[U](x: U) = new { 
    def fromBson[T](implicit ev : BsonReader[T,U]) : T = ... 
} 

같은 뭔가를 생각한다. 암시 적 범위에서는 아무 것도 제공하지 않고 BsonReader[T,U] 만 제공합니다. U을 제거하고 암시 적 매개 변수를 BsonReader[T,DBObject]으로 지정하십시오.

컴파일러가 T을 미리 평가하려고하지 않습니다. TU이 호출 사이트에있을 수 있습니다 (이 경우 U이 문제 임). 암시적인 범위로 암시 적으로 BSonReader[T, DBObject]이 필요합니다. 일반 환경에는 아무 것도 없다고 생각합니다. 암묵적인 매개 변수를 사용하여 통화 사이트에 BsonReader[T,U]을 제공 할 것을 약속합니다. 그것은 그것이 필요한 것이 아닙니다. 매개 변수가 암시 적이 아닌 경우 (fromBson을 호출 할 때 ev를 작성해야 함) 비슷한 오류가 발생합니다.

+0

BsonReader [T, DBObject]와 동일한 문제가 있습니다. 편집 된 질문보기 – dlouwers

+0

물론, DBObject 타입 매개 변수는 실제 DBObject를 숨기고, 매개 변수 U를 호출하는 것과 다르지 않습니다. 필요한 것은 하나의 유형 매개 변수 인 def listBsonReader [T]입니다. –

+1

당신은 절대적으로 옳습니다! DBObject에 명시 적으로 _ 캐스팅하여 컴파일 할 수도 있지만 훨씬 더 좋습니다. Scala의 타입 시스템은 정말 이해하기가 어렵습니다. 미래에 더 많은 두통을 일으킬 것으로 기대되지만 그들과 함께 할 수있는 것을 사랑합니다. 도와 줘서 고맙습니다. – dlouwers

관련 문제