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/