2017-02-26 16 views
2

型の代わりに型lambdaを返す型lambdaをScalaで作成したいとします。Scalaで型lambdaを返す型lambda

def f[A](implicit ev1: Eq[A], ev2: ClassTag[A]) 

これら2つの暗黙の証拠を1つの証拠変数に結合したいと考えています。私は私が定義されて&型ラムダはコンパイルされません。しかし

def f[A: Eq & ClassTag] 

として、前述の機能fを書きたいと思い

type &[E1[_], E2[_]] = ({type λ[T] = Ev2[E1, E2, T]})#λ 

その後、

trait Ev2[E1[_], E2[_], T] extends Product2[E1[T], E2[T]] { 
    def canEqual(that: Any) = false 
} 

object Ev2 { 
    implicit def ev2[T, E1[_], E2[_]](implicit e1: E1[T], e2: E2[T]) = new Ev2[E1, E2, T] { 
    def _1 = e1 
    def _2 = e2 
    } 
} 

を試してみました。型ラムダ(kind of * => *)を返すような型ラムダを書く方法はありますか?

+0

あなたの目標が1行目を簡略化することであれば、なぜdef f [A:Eq: ClassTag] = ??? ' –

+0

@MichaelZajac私は証拠がない関数を統一しようとしています.1つまたは2つの証拠があります。 –

答えて

1

あなたが代わり型ラムダの内部型と実際の形質として&を定義することができます:匿名の特性として

trait &[E1[_], E2[_]] { 
    type λ[T] = Ev2[E1, E2, T] 
} 

または代わり:

type &[E1[_], E2[_]] = { type λ[T] = Ev2[E1, E2, T] } 

そして内部タイプを使用:

def f[A: (Eq & ClassTag)#λ] 
+0

ありがとう!これは私ができる最高のことだと思います。 –

関連する問題