복붙노트

[SCALA] 이유 필터 스칼라의 for 루프 패턴 매칭에 대해 정의 될 수 있는가?

SCALA

이유 필터 스칼라의 for 루프 패턴 매칭에 대해 정의 될 수 있는가?

이해를위한 스칼라에서 사용할 수있는 새로운 클래스를 만들려면, 당신이지도 함수를 정의한다해야 할 모든 것 :

scala> class C[T](items: T*) {
     |   def map[U](f: (T) => U) = this.items.map(f)
     | }
defined class C

scala> for (x <- new C(1 -> 2, 3 -> 4)) yield x
res0: Seq[(Int, Int)] = ArrayBuffer((1,2), (3,4))

의 왼쪽에는 패턴 매칭이없는 경우 그러나 그것은 단지 루프에 대한 간단한 작동 <-. 당신이 거기 패턴 일치하려고하면 필터 메소드가 정의되어 있지 않은 것을 불만을 얻을 :

scala> for ((k, v) <- new C(1 -> 2, 3 -> 4)) yield k -> v
<console>:7: error: value filter is not a member of C[(Int, Int)]
       for ((k, v) <- new C(1 -> 2, 3 -> 4)) yield k -> v

왜 필터는 여기에 일치하는 패턴을 구현하는 데 필요한? 나는 스칼라 단지에 해당하는지도 호출에 위의 루프를 번역 할 것이라고 생각했을 것이다 :

scala> new C(1 -> 2, 3 -> 4).map{case (k, v) => k -> v}
res2: Seq[(Int, Int)] = ArrayBuffer((1,2), (3,4))

for 루프는 다른 뭔가로 번역해야하므로 그러나 그것은, 잘 작동 보인다. 즉, 필터 방법을 필요로 번역 무엇입니까?

해결법

  1. ==============================

    1.짧은 대답 : 스칼라 사양에 따라, 당신은 당신이 준 예를 들어 '필터'방법을 정의 할 필요가 없습니다,하지만 수단이 현재 필요하다고 오픈 버그가 있습니다.

    짧은 대답 : 스칼라 사양에 따라, 당신은 당신이 준 예를 들어 '필터'방법을 정의 할 필요가 없습니다,하지만 수단이 현재 필요하다고 오픈 버그가 있습니다.

    긴 대답 : 함축을 위해 적용되는 desugaring 알고리즘은 스칼라 언어 사양에 설명되어 있습니다. (나는 사양 버전 2.9에서 찾고 있어요)의 "가 함축과 루프를 들어"섹션 6.19부터 시작하자 :

    귀하의 질문에 대한 중요한 점은 이해의 패턴이 주어진 발현 여부에 대해 "반박 할 수없는 '여부입니다. 이 "반박"다음 withFilter가 추가되지 않습니다 경우, 그렇지 않으면이 필요합니다 - (표현이 조금 이후 인은 '<'전에 패턴은 비트입니다.).

    좋아,하지만 "반박"평균 무엇? 사양 ( "반박 패턴")의 섹션 8.1.14로 건너 뜁니다. 컴파일러가 입증 할 수있는 경우 대략 식을 일치시킬 때 패턴이 실패 할 수 있다는 말은 다음 패턴은 반박하고 withFilter 호출이 추가되지 않습니다.

    이제 예상대로 작동합니다 귀하의 예제 섹션 8.1.14 변수 패턴에서 반박 할 수없는 패턴의 첫 번째 유형입니다. 컴파일러는 withFilter가 필요하지 않은 것으로 판단하는 그래서 첫 번째 예는 간단합니다.

    두 번째 예는 잠재적 반박 패턴 생성자 패턴의 세 번째 유형이다. 일치시키고 자 (K를 V) Tuple2 [상관 않음]을 Tuple2 [INT, 지능] 대 (본 명세서에서 참조 섹션 8.1.6 및 8.1.7))는 지능 상관 대한 반박 때문에 성공한다. 따라서, 제 2 패턴도 반박이며 withFilter 방법 필요 (안)하지 않는다.

    withFilter 호출이 추가됩니다 그래서 다니엘의 예에서, Tuple2 [어떤, 어느, 어떤에 대한 반박하지 않습니다.

    그런데, 필터 방법에 대한 오류 메시지 회담 그러나 withFilter에 대한 사양 회담 - 그것은 스칼라 2.8으로 변경되었습니다는 피투성이 자세한 내용은이 질문과 대답을 참조하십시오.

  2. ==============================

    2.차이를 참조하십시오 :

    차이를 참조하십시오 :

    scala> for ((k, v) <- List(1 -> 2, 3 -> 4, 5)) yield k -> v
    res22: List[(Any, Any)] = List((1,2), (3,4))
    
    scala> List(1 -> 2, 3 -> 4, 5).map{case (k, v) => k -> v}
    scala.MatchError: 5
    
  3. from https://stackoverflow.com/questions/4380831/why-does-filter-have-to-be-defined-for-pattern-matching-in-a-for-loop-in-scala by cc-by-sa and MIT license