我想在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)#λ]