외부 공변 컨테이너의 함수 인 매개 변수로서 함수의 리턴 유형의 반 변성 특성을 명확히합니다.

Nov 23 2020

옵션에서 우리는

def getOrElse[B >: A](default: => B): B = this match {
        case None => default
        case Some(a) => a
    }
def orElse[B >: A](obj: => Option[B]): Option[B] = this match {
        case None => obj
        case _ => this
    }

Either에는 다음이 있습니다.

def flatMap[EE >: E, B](f: A => Either[EE, B]): Either[EE, B]

나는 무슨 일이 일어나고 왜 일어나는지 이해합니다.

OrElse ({Option [B]}). map {....} B가 A :> B와 같으면 Some (a)이면 Some (a) .map (f : B => ??? ) 다음 Kaboom

일반적으로 나는 분산에 괜찮다고 생각합니다. 공분산 및 반반 변성의 간단한 예가 유스 케이스로 설명하는 것이 아니기 때문에 내가 보거나 알아 내지 못한 것은 여기에서 확인하고 싶습니다.

매개 변수로서 함수의 반환 유형은 외부 컨테이너의 분산 위치에 대해 확인됩니다.

일반적으로 예는 다음과 같습니다.

Container[+A] {
  def outerfunction[B](value: A): B
}

그런 다음 A에 대한 반 변산 위치에 대해 설명합니다. 그 이유에 대해서는 다시 설명하지 않겠습니다. 우리 모두가 그것을 이해한다고 가정합시다.

일반적으로 설명되지 않는 것은 다음과 같습니다.

Container[+A] {
      def outerfunction(f: ??? => A): A
    }

A 유형의 매개 변수를 취하는 것뿐만 아니라 A를 반환하는 함수 매개 변수도 사용합니다. 컴파일러도이를 확인하기 위해 길게갑니다. 여기서 멈추는 지, 아니면 컨테이너의 기능에 대한 매개 변수로 A를 생성 할 수있는 것이 무엇인지 궁금합니다.

답변

1 slouc Nov 23 2020 at 22:17

당신의 이해는 완전히 정확합니다. 솔직히 말해서 질문이 정확히 무엇인지 확실하지 않지만 다음과 같은 경우 컴파일러가 검사하는 장소가 무엇인지 가정합니다.

trait Container[+A] {
  def outerfunction(f: String => A): A
}

그리고 대답은-그들 모두입니다.

따라서 컴파일러가를 볼 때 모든 발생에 대한 trait Container[+A]본문을 확인하여 다음 위치에 있는지 확인합니다 .ContainerA

  • 매개 변수 위치 (반 변성 요구 사항을 가져옴)
  • 반환 유형 위치 (공변 요구 사항)
  • 둘 다 (불변 요구 사항)
  • 둘 다 (소위 팬텀 분산 ).

의 경우 Container[+A]모든 발생이 A공변 위치에 있어야합니다 String => A. 즉, .

그렇게 간단합니다. "내부 함수"인지 "외부 함수"인지는 중요하지 않습니다.