我希望在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?
答案 0 :(得分:1)
您还可以将&
定义为具有内部类型而非lambda类型的实际特征:
trait &[E1[_], E2[_]] {
type λ[T] = Ev2[E1, E2, T]
}
或者作为匿名特征:
type &[E1[_], E2[_]] = { type λ[T] = Ev2[E1, E2, T] }
然后使用内部类型:
def f[A: (Eq & ClassTag)#λ]