복붙노트

[SCALA] 인수 형 공동는 콘트라 변형되지 아닌가?

SCALA

인수 형 공동는 콘트라 변형되지 아닌가?

나는 용어 ​​공동 분산 및 콘트라 분산을 이해합니다. 하지만 이해 할 수없는 나는 하나의 작은 일이있다. 코 세라의 과정 "스칼라 함수 프로그래밍"에서, 마틴 Ordersky는 언급 :

그래서 자바에서, 예를 들어, 개는 동물 확장 할 수 있습니다. 그리고 함수하자 :

void getSomething(Animal a){

나는 함수 호출 등이

Dog d = new Dog();
getSomething(d)

그래서 기본적으로 happeneing이 무엇인지 그 동물 A = D이다. 그리고 위키 공분산에 따라 "좁힐 넓은 변환"입니다. 그리고 위의 우리는 동물로 개에서 변환된다. SO 인수 유형 공변보다는 contravariant 밤은?

해결법

  1. ==============================

    1.이 기능은 스칼라에서 정의하는 방법입니다 :

    이 기능은 스칼라에서 정의하는 방법입니다 :

    trait Function1 [-T1, +R]  extends AnyRef
    

    영어로, T1 매개 변수 contravariant과 결과 형 R이 공변입니다. 무슨 뜻인가요?

    코드의 일부 조각이 강아지의 기능을 필요로하는 경우 => 동물의 종류, 당신은 동물의 기능을 제공 할 수 => 동물의 유형은 매개 변수의 contravariance 덕분에 (당신은 광범위한 유형을 사용할 수 있습니다).

    또한 개 기능을 제공 할 수 => 개 유형, 결과 형의 공분산 덕분에 (이 좁은 형태를 사용할 수있다).

    이것은 실제로 의미가 있습니다 : 누군가가 함수가 어떤 동물로 개를 변환하고자합니다. 당신은 (개 포함) 동물을 변환하는 기능을 제공 할 수 있습니다. 또한 당신의 기능은 개를 반환 할 수 있지만, 개는 여전히 동물이다.

  2. ==============================

    2.이 공분산하지 그래서 동물로 개를 변환은, 넓은에 좁은 변환된다.

    이 공분산하지 그래서 동물로 개를 변환은, 넓은에 좁은 변환된다.

  3. ==============================

    3.나는 그가 언어 기능에 대해 이야기 한 것처럼 마틴을 제공하는 2007 년 스칼라 책 등을 읽을 때 바로 그 문장에 의해 혼동 기억하지만, 그 문장에서 그는 단지 일반적인 기능에 대한 사실을 말한다. 스칼라, 특히, 모델 단순히 일반 특성에 의해 그 사실. 스칼라 선언 사이트 분산을 갖기 때문에, 그 의미를 나타내는 것은 자연 언어이다.

    나는 그가 언어 기능에 대해 이야기 한 것처럼 마틴을 제공하는 2007 년 스칼라 책 등을 읽을 때 바로 그 문장에 의해 혼동 기억하지만, 그 문장에서 그는 단지 일반적인 기능에 대한 사실을 말한다. 스칼라, 특히, 모델 단순히 일반 특성에 의해 그 사실. 스칼라 선언 사이트 분산을 갖기 때문에, 그 의미를 나타내는 것은 자연 언어이다.

    가장 가까운 사람이 공동으로 얻을 수있는 자바 제네릭, 다른 한편으로, 지원에만 사용하는 사이트 분산, 그래서 / 자바 함수 타입의 contravariance는 각 사용 현장에서 손으로 코드를하는 것입니다 :

    public int secondOrderFunction(Function<? super Integer, ? extends Number> fn) {
         ....
    }
    

    (적절 선언 인터페이스 함수를 가정 P는 리턴 타입 파라미터 유형과 R 방치). 물론, 이후이 코드는 클라이언트의 손에, 모든의 기능에없는 특정는 PARAM 타입 / 리턴 타입의 분산에 대한 문은 자바의 언어 기능에 적용 할 수 없습니다. 이 기능의 성격에 관한, 넓은 의미에서에만 적용됩니다.

    자바 팔 아래 르그의 의견에 따라, 구현이 완전히 본격적인 기능 유형을 포함하지 않습니다, 일류 기능을 의미하는 클로저를 도입,하지만 것입니다.

  4. ==============================

    4.이미 밝혀져로 동물로 개를 변환하는 방법에 대한 원래의 질문을 생각하지만, 기능은 반환 형식에 인수에 contravariant과 공변를 정의하는 이유가 있습니다 관심을 가질 수 있습니다. 의 당신이 두 가지 기능이 있다고 가정 해 봅시다 :

    이미 밝혀져로 동물로 개를 변환하는 방법에 대한 원래의 질문을 생각하지만, 기능은 반환 형식에 인수에 contravariant과 공변를 정의하는 이유가 있습니다 관심을 가질 수 있습니다. 의 당신이 두 가지 기능이 있다고 가정 해 봅시다 :

    발의 F : 척추 => 포유류 = ?? 브로 g : 포유류 => 영장류 = ??

    우리는 기능에 대해 이야기하고, 당신은 기능 구성이 원시적 인 작업 사이에있을 것으로 예상한다. 함수 결과 실제로는 F 및 g을 (g O F)를 구성하는 수로서 얻었다 :

    발에 H : 척추 => = 영장류 andThen g의 F

    하지만 하위 유형으로 g을 대체 할 수있다 :

    발 gChild : 동물 => 영장류

    조합 성을 파괴하지 않고. 그리고 gChild 우리가 인수에 기능 contravariant을 정의 정확하게 때문에 g의 서브 타입이다. 결론적으로, 당신은 당신이 캡처 할 경우 기능이 같은 방식으로 정의해야 볼과 기능의 조합 성의 아이디어를 보존 할 수 있습니다. 당신은 자세한 내용과 여기에이 주제를 소화에 도움이 될 몇 가지 그래픽을 찾을 수 있습니다

  5. from https://stackoverflow.com/questions/13321921/isnt-the-argument-type-co-not-contra-variant by cc-by-sa and MIT license