2017-03-18 1 views
0

을 통과 :내가 코드 다음 한 타 유형

sealed trait Option[+A] { 

    def map[B](f: A => B): Option[B] = this match { 
    case None => None 
    case Some(a) => Some(f(a)) 
    } 

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

    def orElse[B>:A](ob: => Option[B]): Option[B] = 
    this.map(Some(_)).getOrElse(ob) 

} 

case class Some[+A](get: A) extends Option[A] 
case object None extends Option[Nothing] 

기능 orElse 유형 Option[B]의 인수 ob 있습니다. 함수 본문에서 을 getOrElse 함수로 전달하지만 가능한 유형은 B입니다.

B은 어떤 유형이 될 수 있으므로?

답변

3

유형 A은 맨 위에 한 번 표시됩니다. 반면에 유형 B은 각 방법에서 개별적으로 식별/정의되고 있습니다.

그래서 orElse는 알 수없는 유형 B에 대한 Option[B]을 받아까지 getOrElse에 관한 한, 다음 getOrElse에 통과하면, 그 새로운 B된다.

당신이 getOrElse 방법에 대한 C 대신 B을 사용했다면 좀 더 이해하고 orElse 방법에 대한 D 대신 B을 사용 할 수도 있습니다. 모든 것이 똑같이 작동하지만 비 관계를 더 쉽게 볼 수 있습니다.

값 매개 변수와 유사합니다. f(x:Int) = g(x-1) 메소드가있는 경우 수신 된 매개 변수는 x입니다. g(x: Int)=... 메서드는 매개 변수 x도 호출하지만 값이 같음을 의미하지는 않습니다.