类型的lambda返回Scala中的类型Lambda



我想在scala中有一个类型的lambda返回类型lambda而不是类型。

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

我想将这两个隐式证据相结合到一个证据变量中。我尝试了

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
  }
}

然后

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

我想将上述函数 f编写为

def f[A: Eq & ClassTag]

但是,我定义的 &类型lambda并未编译。有没有办法编写这样的类型lambda来返回类型的lambda(类型* => *)?

您还可以将&定义为具有内部类型的实际特征,而不是类型的lambda:

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

或作为匿名特征:

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

然后使用内部类型:

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

最新更新