scala/basic
Variance 문제
wefree
2021. 10. 22. 21:30
scala 에서 이해하기 가장 어려운 부분 중 하나가 Variance 일 것이다.
Variance 를 이해 했다면 다음 문제를 풀어보자.
문제1
아래와 같이 정의했을 때
trait Sum[+A, +B] {
def flatMap[C](f: B => Sum[A, C]): Sum[A, C] = ???
}
다음과 같은 에러 메시지를 보게 될 것이다.
error: covariant type A occurs in contravariant position in type B => Sum[A,C] of value f
이를 해결하려면 어디를 수정해야 할까?
아래와 같이 작성하면 된다. (Why?)
trait Sum[+A, +B] {
def flatMap[T >: A, C](f: B => Sum[T, C]): Sum[T, C] = ???
}
문제2
아래 정의는 아무 문제가 없다. (Why?)
trait Cat[-A, +B] {
def meow(volume: A, listener: Cat[B, A]) : Cat[Cat[B, A], B]
}
참고
https://books.underscore.io/essential-scala/essential-scala.html#variance
https://blog.rockthejvm.com/scala-variance-positions/
https://blog.knoldus.com/covariance-and-contravariance-in-scala/