2012-12-31 3 views
1

higher-order-function 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을 인수로 취할 수 있습니다. 지금, 나는 그러나이 분명히 작동하지 않습니다

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) 

같은 기능을 확장 할 수 Foo을하고 싶습니다. 이 일을 할 수있는 방법이 있습니까? A => A이의 하위 유형이 아니기 때문에 감사

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

이 작동하지합니다 수 없습니다를 수행하지 않습니다 B => B (상위 유형이 아님). 그 이유는 Function1이 인수 유형에는 공 변 (covariant)이고 결과 유형에는 반 변형 (contravariant)이기 때문입니다. 따라서 A => AB => B의 부속 유형이 되려면, A은 서브 유형 수퍼 유형 B이어야합니다. 실제로 AB이 같은 유형 인 경우에만 해당됩니다. tour of Scala for a more in depth explanation of variance을 참조하십시오.

관련 문제