函数返回最具体的类型

时间:2012-12-31 16:57:57

标签: scala functional-programming higher-order-functions

我想要高阶函数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)

Foo的应用方法需要B=>B并返回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) 

同样有效,但我不想携带另外两个类型参数

1 个答案:

答案 0 :(得分:2)

这不能也不应该有效,因为A => A不是B => B的子类型(也不是超类型)。原因是Function1在其参数类型中是协变的,在其结果类型中是逆变的。因此,A => A要成为B => B的子类型,A必须是子类型以及超级类型B。仅当AB实际上是同一类型时才是这种情况。请参阅tour of Scala for a more in depth explanation of variance