输入在Scala中返回类型lambda的lambda

时间:2017-02-26 22:03:56

标签: scala types

我希望在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?

1 个答案:

答案 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)#λ]