1

我想要一个高阶函数Function[K=>V, K=>V],它接受一个函数K=>V并返回给定函数的类型。例如,我希望有以下行为:

  class Foo[K, V]() {
    def apply[K1 <: K, V1 <: V](f: K1 => V1) = f
  }

  // dummy class hierachy
  class A
  class B extends A
  class C extends B

    // a function f: B=>B
  def f(some: B): B = some

  // the desired result
  val result1: B => B = new Foo[A, A]()(f)

apply 方法Foo接受 aB=>B并返回 a B=>B。类型参数KV跟踪“最高”类型Foo可以作为参数。现在,我想Foo扩展功能

  class Bar[K, V] extends Function[K=>V, K=>V]() {
    def apply(f: K => V) = f
  }

  val result2: B => B = new Bar[A, A]()(f)

但这显然不起作用。有没有办法使这项工作?谢谢

编辑

  class Fuzz[K, V, K1 <: K, V1 <: V] extends Function[K1=>V1, K1=>V1] {
    def apply(f: K1 => V1) = f
  }

  val result3: B => B = new Fuzz[A, A, B, B]()(f) 

也可以,但是我不想携带两个额外的类型参数

4

1 回答 1

2

这不能也不应该起作用,因为A => A它不是B => B(也不是超类型)的子类型。原因是 Function1 的参数类型是协变的,结果类型是逆变的。因此,A => A要成为 的子类型B => BA就必须是 的子类型超类型B。只有当A并且B实际上是同一类型时,才会出现这种情况。有关方差的更深入解释,请参阅 Scala 之旅。

于 2012-12-31T17:05:16.653 回答