336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
다시 한번 복습
A <: B 이고 C[A] <: C[B] 인걸 Covariant
A <: B 이고 C[A] >: C[B] 인걸 Contravariant
Contravariant 는 주로 함수를 파라미터로 넘길 때 일어난다고 이야기 함.
이걸 그림으로 다시 생각 해보자, 일단 아래와 같은 클래스가 있다.
class Animal {}
class Bird extends Animal {}
class Chicken extends Bird {}
class Duck extends Bird {}
이걸 밴 다이어 그램으로 그려보면 아래와 같이 된다.
이제 함수를 선언해보자.
object HelloWorld {
type FunctorType[A] = (A => String) //함수타입 한개 선언
val animalFunc : FunctorType[Animal] = { a => "Animal" }
val birdFunc : FunctorType[Bird] = { a => "Bird" }
val chickenFunc : FunctorType[Chicken] = { a => "Chicken"}
val duckFunc : FunctorType[Duck] = { a => "Duck"}
}
위의 밴 다이어 그램을 보면서 다시 정리해보자
Animal >: Bird 이면, FunctorType[Animal] 과 FunctorType[Bird] 의 관계는?
FunctorType[Animal] 을 풀어보면 Animal => String 이고,
FunctorType[Bird] 을 풀어보면 Bird => String 인데,
위의 벤 다이어그램에서 보면, Bird 는 Animal 의 부분집합 이니까, 모든 Bird 는 Animal 이다. 따라서,
FunctorType[Bird] 는 Bird => String 도 될 수 있고, Animal => String 도 될 수 있다.
때문에, FunctorType[Animal] <: FunctorType[Bird] 이 되고,
FunctorType 은 contravariant 가 된다...
'프로그래밍 > Scala' 카테고리의 다른 글
[Slick] DateTime 로딩 시 오류. (0) | 2020.04.05 |
---|---|
Scala 로 뭔가 만들기 위해 필요한 것. (0) | 2020.03.18 |
akka 초반 간략정리. (0) | 2020.02.09 |
Typing Rules for Functions (0) | 2020.02.02 |
Covariant, Contravariant 정리 (0) | 2020.02.02 |
scala implicit keyword 관련 - 파라미터 (0) | 2019.11.17 |
[스칼라] Slick 오류 처리 (0) | 2017.03.26 |
[스칼라] 커링(Currying) - 아마도 첫번째 글. (0) | 2017.02.26 |