2017-12-31 228 views
0

私は型パラメータを含むシングルトン型を試しています。私はそのシングルトン型のWitnessとそのネスト型の型クラスの両方を受け付ける関数を記述しようとしています。これは、(以下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]) = {} 
関連する問題