Infix 연산자의 Scala Match Decomposition
-
06-07-2019 - |
문제
나는 구현을 이해하려고 노력하고 있습니다 List
S 스칼라로. 특히, 나는 디스 픽스 연산자를 사용하여 매치 표현식을 작성하는 방법에 대해 내 머리를 얻으려고 노력하고 있습니다.
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의 프로그래밍)
또한보십시오 스칼라 케이스 클래스 질문
제휴하지 않습니다 StackOverflow