2017-12-31 22 views
0

유형 매개 변수를 포함하는 싱글 톤 유형을 실험하고 있습니다. 그 싱글 톤 유형에 대한 Witness와 중첩 된 유형에 대한 typeclass를 모두 받아들이는 함수를 작성하려고합니다. 그것은 (아래 f1()f2() 참조) 개별적으로 하나를 얻을 쉽게,하지만 난 그것을 동시에 작동시킬 수 없습니다 :동시에 증인과 타입 클래스 받기

inferred type arguments [Nothing,Test.v.type] do not conform to method f3's type parameter bounds [L,M <: Vector[L]] 
[error] f3(v ->> "foo") 

가 거기에 내가 무엇입니까

import shapeless._ 
import shapeless.labelled.FieldType 
import shapeless.syntax.singleton._ 

sealed trait TC[L] 

object TC { 
    implicit def intTC = new TC[Int] {} 
} 

object Test { 
    def f1[VI <: Vector[Int]](value: FieldType[VI, String])(
          implicit wt: Witness.Aux[VI]) = {} 

    def f2[L](value: FieldType[_ <: Vector[L], String])(
      implicit wt: TC[L]) = {} 

    def f3[L, M <: Vector[L]](value: FieldType[M, String])(
          implicit wt: TC[L], witness: Witness.Aux[M]) = {} 

    val v = Vector(1,2,3) 
    f1(v ->> "foo") // works 
    f2(v ->> "foo") // works 
    f3(v ->> "foo") // does not work 
} 

컴파일러가 내부 형과 단일 형을 동시에 추론하는 것을 돕는 방법?

+0

첫 번째 매개 변수 목록에 'L'에 대한 참조가 포함되어 있지 않으므로 'Nothing'으로 추측됩니다. 'f3 [Int, v.type]'으로 호출 해 보았습니까? –

+0

컴파일러에서 유형을 자동으로 추론 할 수있는 방법을 찾고 있습니다. – thesamet

답변

2

다음은 저에게 효과적입니다. MVector[L]의 하위 클래스이고 함께 바인딩하는 증거를 제공하는 암시 적 매개 변수 ev을 추가했습니다. 이것은 컴파일러가 LNothing이라는 것을 유추하는 것을 막기에 충분합니다.

def f3[L, M <: Vector[_]](value: FieldType[M, String])(
          implicit witness: Witness.Aux[M], 
            ev: M <:< Vector[L], 
            wt: TC[L]) = {}