복붙노트

[SCALA] 합니까 스칼라는 C #을 수율에 해당하는가?

SCALA

합니까 스칼라는 C #을 수율에 해당하는가?

나는 스칼라에 새로 온 사람, 그리고 내가 이해에서 스칼라의 수율은 더 많은 선택처럼, C #에서 수율처럼되지 않습니다.

합니까 스칼라는 C #의 수율과 비슷한 있나요? 매우 쉽게 반복자를 작성할 수 있기 때문에 C #의 수율은 중대하다.

업데이트 : 여기에 내가 스칼라에서 구현할 수 있도록하고 싶습니다 C #을에서 의사 코드 예제입니다 :

public class Graph<T> {
   public IEnumerable<T> BreadthFirstIterator() {
      List<T> currentLevel = new List<T>();
      currentLevel.add(_root);

      while ( currentLevel.count > 0 ) {
         List<T> nextLevel = new List<T>();
         foreach( var node in currentLevel ) {
            yield return node;
            nextLevel.addRange( node.Children );
         }
         currentLevel = nextLevel;
      }
   }
}

이 코드를 구현하는 그래프 반복 너비 우선 탐색을 사용하여 수율을, 그것이 호출자 예컨대, 일반 루프를 이용하여 그래프를 통과 할 수 그래서, 반복자를 반환 :

graph.BreadthFirstIterator().foreach( n => Console.WriteLine( n ) );

C #에서, 수율은 쉽게 반복자를 작성 (자바에서의 Iterable와 유사한 닷넷을 IEnumerable 를) 만들 단지 문법 설탕입니다. 반복자로서, 그 게으르게 평가했다.

업데이트 II : 내가 잘못 여기에있을 수 있지만 나는 C #에서 수율의 요점은 당신이 고차 함수를 작성하지 않아도 그렇게 생각합니다. 예를 들면 당신은 루프 정기적를 작성하거나 선택 /지도 / 필터 같은 방법을 사용할 수 있습니다 / 어디 대신 다음 순서를 통과하는 함수에 전달.

예를 들면 graph.iterator (). foreach는 (N =>에 println (N)) 대신 graph.iterator의 (N =>에 println (N)).

만약 체인이 길 수이를 쉽게 예컨대 graph.iterator ().지도 (X => x.foo) .filter (Y => y.bar> = 2) .foreach (Z =>에 println (z)).

해결법

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

    1.단어 수율의 납치 여기에 평소 의도에서 그러기 : 코 루틴의 시작 / 종료 마커로. 그 코 루틴 의미에서 사용 수율 나타날 위의 예에서 C # BreadthFirstIterator; 값이 수익률에 의해 반환 된 후, 활성 BreadthFirstIterator의를 IEnumerable 다음 호출은 항복 후 다음 문으로 계속됩니다.

    단어 수율의 납치 여기에 평소 의도에서 그러기 : 코 루틴의 시작 / 종료 마커로. 그 코 루틴 의미에서 사용 수율 나타날 위의 예에서 C # BreadthFirstIterator; 값이 수익률에 의해 반환 된 후, 활성 BreadthFirstIterator의를 IEnumerable 다음 호출은 항복 후 다음 문으로 계속됩니다.

    C #에서, 수율은 오히려 더 일반적인 제어 흐름 문을 것보다 반복의 개념에 연결되어 있지만, 제한된 도메인 내에서의 동작은 코 루틴의입니다. 스칼라의 구분 연속성을은 코 루틴을 정의하는 하나 허용 할 수 있습니다. 그때까지, 스칼라 특히 수율에 대한 다른 의미를 부여 그러한 능력을 부족합니다.

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

    2.그렇습니다, 당신은 답변이 질문을보고 할 수 있습니다 않습니다 : 스칼라의 수율은 무엇입니까?

    그렇습니다, 당신은 답변이 질문을보고 할 수 있습니다 않습니다 : 스칼라의 수율은 무엇입니까?

    다음은 구조의 유형에 대한 스칼라에서 문서입니다 : http://www.scala-lang.org/node/111

    최신 정보:

    C #을 수율 및 스칼라에 대한이 블로그 회담 : http://hestia.typepad.com/flatlander/2009/01/scala-for-c-programmers-part-1-mixins-and-traits.html

    그는 확장 스칼라에서 특성을 사용하여 비교를 IEnumerable 작품을 만드는 데 사용되는 방법에 대한 몇 가지 세부 사항으로 간다.

    그래서, 당신은 수율이 C ​​#과 같은 스칼라에서 같은 방식으로 작동하지 않습니다 올바른지,하지만 그들은 매우 다르기 때문에 즉, 당신이 형질로이 BreadthFirst을 수행하려는 경우 그래서 다음지도 ()와 필터를 호출 할 수 있습니다 그리고 foreach는 방법, 당신이 C #에서 것이나, 특성 컬렉션을 통과하는 방법의 문제를 해결하는 데 도움이 될 것입니다있다.

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

    3.나는 스칼라는 C 번호와 유사한 문법 설탕 쓰기 반복자에의 수율 (IEumerable 또는의 Iterable의 구현)이없는 (2.8 변경 금지) 대답은 대답이없는 것을 없다 생각합니다.

    나는 스칼라는 C 번호와 유사한 문법 설탕 쓰기 반복자에의 수율 (IEumerable 또는의 Iterable의 구현)이없는 (2.8 변경 금지) 대답은 대답이없는 것을 없다 생각합니다.

    그러나, 스칼라 대신이 순회의 각 항목에 대해 호출 할 것이다 순회에 함수에 전달하여 유사한 결과를 얻을 수 있습니다. 이러한 접근 방식은 C #에서 동일한 방식으로 구현 될 수있다.

    여기에 내가 수율을 사용하지 않고 C #에서 트래버스을 써서하는 방법이다 :

    public class Graph<T> {
       public void BreadthFirstTraversal( Action<T> f) {
          List<T> currentLevel = new List<T>();
          currentLevel.add(_root);
    
          while ( currentLevel.count > 0 ) {
             List<T> nextLevel = new List<T>();
             foreach( var node in currentLevel ) {
                f(node);
                nextLevel.addRange( node.Children );
             }
             currentLevel = nextLevel;
          }
       }
    }
    

    그런 다음이처럼 사용할 수 있습니다 :

    graph.BreadthFirstTraversal( n => Console.WriteLine( n ) );
    

    또는과 같습니다 :

    graph.BreadthFirstTraversal( n =>
    {
       Console.WriteLine(n);
       DoSomeOtherStuff(n);
    });
    
  4. ==============================

    4.스칼라 키워드 수율을 가지고 있지만, 그것은 C #을 수율 상당히 다른, 그리고 루비의 수율은 모두 다릅니다. 격렬하게 남용 키워드 보인다. C # 수율의 사용은 첫 눈에 제한 나타납니다.

    스칼라 키워드 수율을 가지고 있지만, 그것은 C #을 수율 상당히 다른, 그리고 루비의 수율은 모두 다릅니다. 격렬하게 남용 키워드 보인다. C # 수율의 사용은 첫 눈에 제한 나타납니다.

    스칼라에서 동일한 작업을 수행하려면, 당신은 당신의 자신의 고차 함수를 정의 할 수 있습니다. 영어에서, 즉, 파라미터로서 기능을 취하는 함수를 의미한다.

    마이크로 소프트의 예를 들자면, 여기 스칼라 방법입니다 :

    object Powers {
      def apply(number:Int, exponent:Int) (f:(Double) => Any) = {
        (new Range(1,exponent+1,1)).map{exponent => f(Math.pow(number, exponent))}
      }
    }
    

    지금 당신은 당신의 "반복자"가 :

    scala> Powers(2,8){ println(_) }
    2.0
    4.0
    8.0
    16.0
    32.0
    64.0
    128.0
    256.0
    

    노트:

    규모 : 1, C 번호 : 0

    최신 정보:

    당신이 그것을 사용하려고하는 방법에 대한 당신은 생각하지 않고 원하는 탐색을 수행하여 방금 추가 한 예를 들어, 쓰기 트래버스하십시오. 이어서 (F (노드) => 없음) 트래버스 파라미터리스트 후, 예를 들면 가산함으로써 추가 파라미터를 추가 할

    def traverse(node:Node, maxDepth:Int)(f(Node) => Any)) { ... }
    

    당신은 C #, 전화 F (yieldValue)에서 함께 얻을 것입니다 값이 트래버스의 시점에서.

    이 "반복자"전화 트래버스를 사용하고에 함수를 통과 할 때 당신이 반복자의 각 요소에 대해하고 싶은 무엇이든 않습니다.

    traverse(node, maxDepth) { (yieldValue) =>
      // this is f(yieldValue) and will be called for each value that you call f with
      println(yieldValue)
    }
    

    이 "함수형 프로그래밍"에 대한 기본 경우 그리고 당신은 당신이 그것을 스칼라와 성공을 이해해야합니다.

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

    5.당신은 구분 연속성을 측면에서 발전기의 구현을 사용하여 스칼라> = 2.8에서이 작업을 수행 할 수 있습니다. 당신은 연속 요청이 라인을 따라 무언가 플러그인 및 필요합니다

    당신은 구분 연속성을 측면에서 발전기의 구현을 사용하여 스칼라> = 2.8에서이 작업을 수행 할 수 있습니다. 당신은 연속 요청이 라인을 따라 무언가 플러그인 및 필요합니다

    import scala.continuations._
    import scala.continuations.ControlContext._
    
    object Test {
    
      def loopWhile(cond: =>Boolean)(body: =>(Unit @suspendable)): Unit @suspendable = {
        if (cond) {
          body
          loopWhile(cond)(body)
        } else ()
      }
    
      abstract class Generator[T] {
        var producerCont : (Unit => Unit) = null
        var consumerCont : (T => Unit) = null
    
        protected def body : Unit @suspendable
    
        reset {
          body
        }
    
        def generate(t : T) : Unit @suspendable =
          shift {
            (k : Unit => Unit) => {
              producerCont = k
              if (consumerCont != null)
                consumerCont(t)
            }
          }
    
        def next : T @suspendable =
          shift {
            (k : T => Unit) => {
              consumerCont = k
              if (producerCont != null)
                producerCont()
            }
          }
      }
    
      def main(args: Array[String]) {
        val g = new Generator[Int] {
          def body = {
            var i = 0
            loopWhile(i < 10) {
              generate(i)
              i += 1
            }
          }
        }
    
        reset {
          loopWhile(true) {
            println("Generated: "+g.next)
          }
        }
      }
    }
    
  6. ==============================

    6.이미 언급 한 바와 같이 당신은 정확히 C 번호처럼 행동하는 수율을 만들 연속성을가-플러그인을 사용하여 발전기를 만들 수 있습니다 :

    이미 언급 한 바와 같이 당신은 정확히 C 번호처럼 행동하는 수율을 만들 연속성을가-플러그인을 사용하여 발전기를 만들 수 있습니다 :

    import scala.util.continuations._
    
    object GenTest {
    
        val gen = new Generator[Int] { def produce = {
            yieldValue(1)
            yieldValue(2)
            yieldValue(3)
            Thread.sleep(1000)
            yieldValue(42)
      }}
    
    
        def main(args: Array[String]): Unit = {
            for (v <- gen) {
                println(v)
            }
        }
    }
    
    abstract class Generator[E] {
    
        var loopFn: (E => Unit) = null
    
        def produce(): Unit @cps[Unit]
    
      def foreach(f: => (E => Unit)): Unit = {
            loopFn = f
            reset[Unit,Unit]( produce )
      }
    
      def yieldValue(value: E): Unit @cps[Unit] =
        shift { genK: (Unit => Unit) =>
          loopFn( value )
          genK( () )
          ()
        }
    
    }
    
  7. ==============================

    7.C #을 배경에서 오는 및 (스칼라 2.11.6에 적응) hotzen에서 스칼라 코드를 디버깅하는 데,이 연속성을 사용 가까이는 C #에 동등한 -yield 제공 말해야한다. 연속성을 여전히 다수의 발전기가 필요했다 유사한 경우 작동한다면 나는 같은 방법으로 모두를 실행 모르거나 아마도 다른 방법을 통해 확산,하지만 난 행복 연속성을 내가 달성하기 위해 여러 스레드와 함께 작동하도록 강제하고 있지 않다 그래서 존재를 할 생각 답신 전화를 따라 유사, 또는 패스.

    C #을 배경에서 오는 및 (스칼라 2.11.6에 적응) hotzen에서 스칼라 코드를 디버깅하는 데,이 연속성을 사용 가까이는 C #에 동등한 -yield 제공 말해야한다. 연속성을 여전히 다수의 발전기가 필요했다 유사한 경우 작동한다면 나는 같은 방법으로 모두를 실행 모르거나 아마도 다른 방법을 통해 확산,하지만 난 행복 연속성을 내가 달성하기 위해 여러 스레드와 함께 작동하도록 강제하고 있지 않다 그래서 존재를 할 생각 답신 전화를 따라 유사, 또는 패스.

  8. from https://stackoverflow.com/questions/1655738/does-scala-have-an-equivalent-to-c-sharp-yield by cc-by-sa and MIT license