【问题标题】:Type lambda that returns a type lambda in Scala在 Scala 中返回类型 lambda 的类型 lambda
【发布时间】:2017-02-26 22:03:55
【问题描述】:

我想在 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 行,那你为什么不直接写 def f[A : Eq : ClassTag] = ???
  • @MichaelZajac 我正在尝试统一没有证据、1 或 2 证据的函数。

标签: scala types


【解决方案1】:

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

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

或者作为一个匿名特征:

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

然后使用内部类型:

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

【讨论】:

  • 非常感谢!我想这是我能做的最好的了。
猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 2018-01-21
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多