2017-02-26 101 views
2

我想在Scala中有一个返回类型lambda而不是类型的类型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(类型为* => *)?

+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

非常感谢!我想这是我能做的最好的事情。 –