문제

나는 구현을 이해하려고 노력하고 있습니다 ListS 스칼라로. 특히, 나는 디스 픽스 연산자를 사용하여 매치 표현식을 작성하는 방법에 대해 내 머리를 얻으려고 노력하고 있습니다.

a match {
  case Nil => "An empty list"
  case x :: Nil => "A list without a tail"
  case x :: xs => "A list with a tail"
}

경기 표현은 어떻게 될 수 있습니까? x :: xs 보다는 List(x, xs)?

도움이 되었습니까?

해결책

Jay Conrad의 대답은 거의 옳습니다. 중요한 것은 그 것입니다 어딘가에 이름이 지정된 개체가 있습니다 :: 그것을 구현합니다 unapply 방법, 반환 유형 Option[(A, List[A])]. 따라서 :

object :: {
  def unapply[A](ls: List[A]): Option[(A, A)] = {
    if (ls.empty) None
    else Some((ls.head, ls.tail))
  }
}

// case objects get unapply for free
case object Nil extends List[Nothing]

의 경우 :: 그리고 List,이 목적은 :: 연장되는 사례 클래스입니다 List 특성. 그러나 위의 예에서 알 수 있듯이 가지다 사례 수업이되기 위해.

다른 팁

나는 믿는다 ::는 실제로 수업입니다 (목록의 서브 클래스), 그래서 말하기 x :: xs 대부분과 같습니다 List(x, xs).

운영자 이름이있는 다른 케이스 클래스로이를 수행 할 수 있습니다. 예를 들어:

case class %%%(x: Int, y: Int)

a match {
  case x %%% y => x + y
}

매치 표현식은 목록 (x, xs)이 아닌 x :: xs로 어떻게 허용됩니까?

이 질문에 답하기 위해 :

a로 볼 때 무늬, 다음과 같은 디픽 작업 p op q 동일합니다 OP (P, Q). 즉, Infix Operator OP는 생성자 패턴.

(Scala, 1st ed., p. 331의 프로그래밍)

또한보십시오 스칼라 케이스 클래스 질문

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top