2012-12-31 69 views
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) 

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) 

同样的作品,但我不想携带两个附加的类型参数

+0

这可能是以下副本:http://stackoverflow.com/q/663254/1019358 – seliopou

回答

2

这不能也不应该不行的,因为A => A不是一个亚型B => B(而不是超类型)。原因是Function1在其参数类型中是协变的,而在结果类型中是相反的。因此,对于A => AB => B的子类型,A将必须是的子类型以及超类型B。如果AB实际上是相同类型,则只有这种情况。请参阅tour of Scala for a more in depth explanation of variance