수색…


통사론

  • 몸을위한 {절}
  • {clauses} 항복 몸
  • 몸을위한 (절)
  • 몸을 산출하기위한 (절)

매개 변수

매개 변수 세부
...에 대한 for 루프 / 이해를 사용하는 데 필요한 키워드
조항 for가 작동하는 반복 및 필터입니다.
수율 컬렉션을 만들거나 '산출'하려면이 옵션을 사용하십시오. yield 를 사용하면 for 의 반환 유형이 Unit 아닌 콜렉션이됩니다.
신체 각 반복마다 실행되는 for 표현식의 본문입니다.

기본 For 루프

for (x <- 1 to 10)
  println("Iteration number " + x)

이것은 변수 x1 에서 10 까지 반복하고 그 값으로 무엇인가를하는 것을 보여줍니다. 이해를 for 리턴 타입은 Unit 입니다.

기본 이해력

이것은 for-loop에 대한 필터와 'sequence comprehension'을 만들기위한 yield 의 사용법을 보여줍니다.

for ( x <- 1 to 10 if x % 2 == 0)
  yield x

이 출력은 다음과 같습니다.

scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10)

A 이해는 반복 및 필터를 기반으로 새 모음을 만들어야 할 때 유용합니다.

Nested For Loop

다음은 여러 변수를 반복하는 방법을 보여줍니다.

for {
  x <- 1 to 2
  y <- 'a' to 'd'
} println("(" + x + "," + y + ")")

(참고 to 여기에 반환하는 중위 연산자 방법 을 포함 범위를 . 정의를 참조하십시오 여기에 .)

그러면 출력이 생성됩니다.

(1,a)
(1,b)
(1,c)
(1,d)
(2,a)
(2,b)
(2,c)
(2,d)

이것은 대괄호 대신 괄호를 사용하는 동일한 표현식입니다.

for (
  x <- 1 to 2
  y <- 'a' to 'd'
) println("(" + x + "," + y + ")")

모든 조합을 단일 벡터로 가져 오려면 결과를 yield 하고이를 val 설정할 수 있습니다.

val a = for {
  x <- 1 to 2
  y <- 'a' to 'd'
} yield "(%s,%s)".format(x, y)
// a: scala.collection.immutable.IndexedSeq[String] = Vector((1,a), (1,b), (1,c), (1,d), (2,a), (2,b), (2,c), (2,d))

이해를위한 모나드

모나드 유형의 객체가 여러 개인 경우 'for comprehension'을 사용하여 값의 조합을 얻을 수 있습니다.

for {
   x <- Option(1)
   y <- Option("b")
   z <- List(3, 4)
} {
    // Now we can use the x, y, z variables
    println(x, y, z)
    x  // the last expression is *not* the output of the block in this case!
}

// This prints
// (1, "b", 3)
// (1, "b", 4)

이 블록의 반환 유형은 Unit 입니다.

객체가 동일한 모나드 타입 M (예 : Option ) 인 경우 yield 를 사용 yield Unit 대신 M 유형의 객체가 반환됩니다.

val a = for {
   x <- Option(1)
   y <- Option("b")
} yield {
    // Now we can use the x, y variables
    println(x, y)
    // whatever is at the end of the block is the output
    (7 * x, y)
}

// This prints:
// (1, "b")
// The val `a` is set:
// a: Option[(Int, String)] = Some((7,b))

yield 키워드 모나드 유형 ( OptionList )이 혼합되어있는 원래 예제에서는 사용할 수 없습니다 . 이렇게하면 컴파일 타임 형식 불일치 오류가 발생합니다.

For 루프를 사용하여 컬렉션을 반복합니다.

지도의 각 요소를 인쇄하는 방법을 보여줍니다.

val map = Map(1 -> "a", 2 -> "b")
for (number <- map) println(number) // prints (1,a), (2,b)
for ((key, value) <- map) println(value) // prints a, b

목록의 각 요소를 인쇄하는 방법을 보여줍니다.

val list = List(1,2,3)
for(number <- list) println(number) // prints 1, 2, 3

이해력을위한 Desugaring

스칼라 for 이해는 단지 통사론적인 설탕 이다. 이러한 withFilterwithFilter , foreach , flatMap 및 해당 주제 유형의 map 메소드를 사용하여 구현됩니다. 이러한 이유로 정의 된 이러한 메소드가있는 유형 만이 이해를 for 활용 될 수 있습니다.

A for 패턴 pN , 제너레이터 gN 및 조건 cN 을 갖는 다음 형태의 이해를 for .

for(p0 <- x0 if g0; p1 <- g1 if c1) { ??? }

... withFilterforeach 사용하여 중첩 된 호출에 de-sugar합니다.

g0.withFilter({ case p0 => c0  case _ => false }).foreach({
  case p0 => g1.withFilter({ case p1 => c1  case _ => false }).foreach({
    case p1 => ???
  })
})

반면에 다음과 같은 형식의 for / yield 표현식은 다음과 같습니다.

for(p0 <- g0 if c0; p1 <- g1 if c1) yield ???

... withFilterflatMap 또는 map 사용하여 중첩 된 호출에 설탕을 flatMap map .

g0.withFilter({ case p0 => c0  case _ => false }).flatMap({
  case p0 => g1.withFilter({ case p1 => c1  case _ => false }).map({
    case p1 => ???
  })
})

( map 는 가장 안쪽의 이해력에 사용되며 flatMap 은 모든 외부 이해에 사용됩니다.)

for 이해는 디 설탕 표현에 필요한 방법을 구현하는 임의의 타입에 적용될 수있다. 이러한 메소드의 반환 유형은 구성 가능한 한 제한이 없습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow