2009-06-20 6 views
9

스칼라에서 List의 구현을 이해하려고합니다. 당신이 중위 연산자를 사용하여 일치 식을 쓸 수있는 방법을 특히 내가 예를 들어, 주위에 내 머리를 얻으려고 :중위 연산자의 스칼라 매치 분해

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) 될 수있다?

답변

13

제이 콘래드의 답변이 거의 맞습니다. 중요한 것은 어딘가의입니다 ::이라는 객체가 unapply 메서드를 구현하고 Option[(A, List[A])] 유형을 반환합니다. thusly 히 :

object :: { 
    def unapply[A](ls: List[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 특성을 확장하는 경우 클래스라는 사실에서 나온 발생합니다. 그러나 위의 예제에서 볼 수 있듯이 은 케이스 클래스가 될이 아닙니다.

7

나는 :: is actually a class (이는 List의 하위 클래스입니다.) 따라서 x :: xs은 대부분 List(x, xs)과 같습니다.

연산자 이름이있는 다른 사례 클래스에서이 작업을 수행 할 수 있습니다. 예 :

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

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

일치 식은 List (x, xs) 대신 x :: xs가 될 수 있습니까? 패턴 같은 P 연산 Q에 OP (P, Q) 상당 중위 동작으로 볼 때

:

이 질문에 대답. 즉, 중첩 된 연산자 op는 생성자 패턴으로 처리됩니다.

(스칼라 프로그래밍, 첫번째 에디션., P. 331)

도 참조 scala case classes questions