복붙노트

[SCALA] 스칼라의 수율은 무엇입니까?

SCALA

스칼라의 수율은 무엇입니까?

나는 루비와 파이썬의 수율을 이해합니다. 스칼라의 수율은 무엇입니까?

해결법

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

    1.그것은 (당신이 수율도 사용할 수 있습니다 파이썬의리스트 지능형 발전기, 등) 순서 함축에 사용됩니다.

    그것은 (당신이 수율도 사용할 수 있습니다 파이썬의리스트 지능형 발전기, 등) 순서 함축에 사용됩니다.

    그것은 위해 조합하여 적용하고, 생성 된 시퀀스에 새로운 요소를 기록한다.

    간단한 예 (스칼라 LANG)에서

    /** Turn command line arguments to uppercase */
    object Main {
      def main(args: Array[String]) {
        val res = for (a <- args) yield a.toUpperCase
        println("Arguments: " + res.toString)
      }
    }
    

    F 번호에 해당하는 표현이 될 것이다

    [ for a in args -> a.toUpperCase ]
    

    또는

    from a in args select a.toUpperCase 
    

    Linq에있다.

    루비의 수율은 다른 효과가 있습니다.

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

    2.내가 허용 대답은 좋은 생각하지만, 많은 사람들이 몇 가지 근본적인 점을 파악하지 못한 것 같다.

    내가 허용 대답은 좋은 생각하지만, 많은 사람들이 몇 가지 근본적인 점을 파악하지 못한 것 같다.

    첫째, 스칼라의 함축에 대한이의 표기법을 하스켈에 해당합니다, 그것은 여러 모나드 작업의 구성을위한 문법 설탕에 불과하다. 가장 가능성이 도움을 필요로 사람을 도움이되지 않습니다이 문장으로 ... :-) 다시 해보자

    스칼라의 함축에 대한지도, flatMap 및 필터와 여러 작업의 구성에 대한 문법 설탕입니다. 또는 foreach는. 스칼라 실제로 이러한 방법에 대한 호출로에 대한 표현을 변환, 그래서 어떤 클래스를 제공 또는 이들의 일부는 함축을 위해 사용할 수 있습니다.

    먼저, 번역에 대해 이야기하자. 아주 간단한 규칙이 있습니다 :

    당신이 함축에 대한 매우 간단한 볼 때,지도 / foreach는 대안은, 참으로, 더 잘. 당신이 그들을 작성하기 시작하면,하지만 당신은 쉽게 괄호와 중첩 레벨에서 길을 잃을 수 있습니다. 그렇게되면, 지능형 대개 훨씬 명확하다.

    나는 하나의 간단한 예를 보여주고, 의도적으로 어떤 설명을 생략 할 것이다. 당신은 쉽게 이해할 수 있던 구문 결정할 수 있습니다.

    l.flatMap(sl => sl.filter(el => el > 0).map(el => el.toString.length))
    

    또는

    for {
      sl <- l
      el <- sl
      if el > 0
    } yield el.toString.length
    

    스칼라 2.8 그의 주요 차이 대신 새로운 여과 수집 돌리는 이는 요청 필터링이다 withFilter라는 방법을 소개했다. 필터 방법은 컬렉션의 엄격함에 기초하여 정의 된 동작을 갖는다. 이 더 잘 이해하기 위해 목록 (엄격한) 및 스트림 (비 엄격한)와 일부 스칼라 2.7에서 살펴 보자 :

    scala> var found = false
    found: Boolean = false
    
    scala> List.range(1,10).filter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
    1
    3
    7
    9
    
    scala> found = false
    found: Boolean = false
    
    scala> Stream.range(1,10).filter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
    1
    3
    

    필터가 즉시 확률의 목록을 반환 목록으로 적용되기 때문에 차이가 발생합니다 - FOUND가 false 때문이다. 필터가 이미 실행 된 것처럼 만 다음 foreach 문이 발견 변경,이 시간에 의해 실행되지만은 의미가 없다.

    스트림의 경우, 조건은 immediatelly 적용되지 않습니다. 각 요소의 foreach 요청한대로 그 대신에, 필터는 발견을 통해의 foreach에 영향을 미칠 수있는 조건을 테스트한다. 그냥 명확하게하기 위해, 여기에 상응를위한 이해 코드는 다음과 같습니다

    for (x <- List.range(1, 10); if x % 2 == 1 && !found) 
      if (x == 5) found = true else println(x)
    
    for (x <- Stream.range(1, 10); if x % 2 == 1 && !found) 
      if (x == 5) found = true else println(x)
    

    대신 사전에 전체 컬렉션에 적용되는의, 주문형 고려 될 경우 사람들이 예상하기 때문에, 많은 문제를 일으켰습니다.

    항상 비 엄격 스칼라 2.8 도입 withFilter, 상관없이 컬렉션의 엄격. 다음의 예는 스칼라 2.8에 두 가지 방법으로 목록을 보여줍니다

    scala> var found = false
    found: Boolean = false
    
    scala> List.range(1,10).filter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
    1
    3
    7
    9
    
    scala> found = false
    found: Boolean = false
    
    scala> List.range(1,10).withFilter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
    1
    3
    

    이 필터가 작동하는 방식을 변경하지 않고, 대부분의 사람들이 기대하는 결과를 생성합니다. 사이드 참고로, 범위는 스칼라 2.7 및 스칼라 2.8 사이에 엄격한에 비 엄격한 변경되었습니다.

  3. ==============================

    3.Earwicker 말한대로 예, 그것은 꽤 많이 LINQ의 선택에 상응 그리고 루비와 파이썬의 수율로 할 거의있다. 기본적으로, C #에서 당신이 쓸 것 인

    Earwicker 말한대로 예, 그것은 꽤 많이 LINQ의 선택에 상응 그리고 루비와 파이썬의 수율로 할 거의있다. 기본적으로, C #에서 당신이 쓸 것 인

    from ... select ??? 
    

    스칼라 대신이

    for ... yield ???
    

    그것은을 위해-함축 그냥하지만 ​​단지 LINQ와 같은 특정 메서드를 정의 어떤 유형, 시퀀스가 ​​작동하지 않는다는 것을 이해하는 것도 중요합니다 :

  4. ==============================

    4.당신이 스칼라 사용자로부터 더 나은 해답을 (내가 아니에요한다) 취득하지 않는 한, 여기 내 이해입니다.

    당신이 스칼라 사용자로부터 더 나은 해답을 (내가 아니에요한다) 취득하지 않는 한, 여기 내 이해입니다.

    단지 표현의 일부 기존 목록에서 새 목록을 생성하는 방법을 어떤 상태에 대한로 시작으로 나타납니다.

    뭔가 같은 :

    var doubled = for (n <- original) yield n * 2
    

    (I 중복을 삭제하는 방법이 믿고 있지만) 그래서 각 입력에 대한 하나 개의 출력 항목이있다.

    이것은 거의 모든 구조에 일부 필수 코드에서, 그것은 어떤 길이의 목록을 생성 할 수있는 방법을 제공합니다 다른 언어 수율에 의해 활성화 "필수 연속성을"매우 다르다.

    (당신은 C #을 잘 알고 있다면, 그것은 수익을 산출하는 것보다 LINQ의 선택 연산자에 가깝다).

  5. ==============================

    5.스칼라의 키워드 수율은 다니엘 소브랄 이미 상세하게 설명으로 쉽게지도로 대체 될 수있다 단순히 문법 설탕입니다.

    스칼라의 키워드 수율은 다니엘 소브랄 이미 상세하게 설명으로 쉽게지도로 대체 될 수있다 단순히 문법 설탕입니다.

    파이썬과 비슷한 발전기 (또는 연속성을)를 찾고 있다면 반면에, 수율은 절대적으로 잘못된 것입니다. 이 SO 자세한 내용은 스레드를 참조하십시오 : 스칼라에 '항복'을 구현하기 위해 선호하는 방법은 무엇입니까?

  6. ==============================

    6.다음에 대한-이해를 고려

    다음에 대한-이해를 고려

    val A = for (i <- Int.MinValue to Int.MaxValue; if i > 3) yield i
    

    다음과 같이 큰 소리로 그것을 읽을 도움이 될 수 있습니다

    "이 3보다 큰 경우에는 각 정수 난 후 난을 (생산)을 수득하고, A. 목록에 추가"

    수학적인 조건 제시 법의 측면에서, 위의-이해를 위해 유사하다

    이는로 판독 될 수있다

    "그것보다 크면 각 정수를 들어, 그 세트의 일원이다."

    또는 대안으로서

    "모든 정수의 집합, 각보다 큰 같은 것입니다."

  7. ==============================

    7.수율은 우리가 볼 수없는 각 증가 들어, 버퍼에 다음 항목을 추가 유지하는 버퍼를 가지고 루프와 유사하다. For 루프가 실행을 완료하면, 모든 산출 값의 컬렉션을 반환합니다. 수익률은 간단한 산술 연산자로 또는 배열과 결합하여 사용할 수 있습니다. 여기에 귀하의 더 나은 이해를위한 두 가지 간단한 예입니다

    수율은 우리가 볼 수없는 각 증가 들어, 버퍼에 다음 항목을 추가 유지하는 버퍼를 가지고 루프와 유사하다. For 루프가 실행을 완료하면, 모든 산출 값의 컬렉션을 반환합니다. 수익률은 간단한 산술 연산자로 또는 배열과 결합하여 사용할 수 있습니다. 여기에 귀하의 더 나은 이해를위한 두 가지 간단한 예입니다

    scala>for (i <- 1 to 5) yield i * 3
    

    입술 : scala.collection.immutable.IndexedSeq [지능 = 벡터 (3, 6, 9, 12, 15)

    scala> val nums = Seq(1,2,3)
    nums: Seq[Int] = List(1, 2, 3)
    
    scala> val letters = Seq('a', 'b', 'c')
    letters: Seq[Char] = List(a, b, c)
    
    scala> val res = for {
         |     n <- nums
         |     c <- letters
         | } yield (n, c)
    

    입술 서열 [(INT 차르) = 목록 ((1, a), (1, b), (1, c), (2, a), (2, b) (2, C) ( 3, a), (3, b), (3, c))

    도움이 되었기를 바랍니다!!

  8. ==============================

    8.

    val aList = List( 1,2,3,4,5 )
    
    val res3 = for ( al <- aList if al > 3 ) yield al + 1
    val res4 = aList.filter(_ > 3).map(_ + 1)
    
    println( res3 )
    println( res4 )
    

    코드의이 두 조각은 동일합니다.

    val res3 = for (al <- aList) yield al + 1 > 3
    val res4 = aList.map( _+ 1 > 3 )
    
    println( res3 ) 
    println( res4 )
    

    코드의이 두 개는 동일합니다.

    지도 수율 반대의 경우도 마찬가지만큼 유연하다.

  9. ==============================

    9.수율 맵 ()보다 더 유연 아래 예 참조

    수율 맵 ()보다 더 유연 아래 예 참조

    val aList = List( 1,2,3,4,5 )
    
    val res3 = for ( al <- aList if al > 3 ) yield al + 1 
    val res4 = aList.map( _+ 1 > 3 ) 
    
    println( res3 )
    println( res4 )
    

    수율이 같은 결과를 출력 할 것이다 : 목록 (5, 6), 이는 좋은

    지도는 ()와 같은 결과를 반환합니다 반면 : 목록 (참, 참, 거짓 거짓 사실), 아마 인 당신은 무슨 의도.

  10. from https://stackoverflow.com/questions/1052476/what-is-scalas-yield by cc-by-sa and MIT license