복붙노트

[SCALA] 황조롱이 함수형 프로그래밍 디자인 패턴의 부가가치는 무엇인가? (스칼라)

SCALA

황조롱이 함수형 프로그래밍 디자인 패턴의 부가가치는 무엇인가? (스칼라)

그렇게 유용 황조롱이를 사용하여 코드의 부작용 부분을 치우 왜 궁금하네요. 합니까 누군가가 경험이있다? 과 의욕을 설명 할 수있는 방법 정확히 도움 않습니다.

내가 이해하지만 그 순수 기능을 프로그래밍 코드의 제로 부작용 이제부터는 더 나은 디버깅 및 예측에 관한 것입니다. 그러나 황조롱이의 경우는 정말 그렇게 할 수 있도록 도와드립니다 표시되지 않는 이유는 무엇입니까?

베스트,

MM-

해결법

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

    1.요점은 당신이 아마 주위에 거짓말을 한 것으로, 또는 지나가는하고있는 무언가에 대한 새로운 블록을 생성하는 것을 피하기 싶지 않아 중간 변수를 만들지 않도록하는 것입니다. 이제 우리는 루비에서와 황조롱이이 있다고 가정하자 :

    요점은 당신이 아마 주위에 거짓말을 한 것으로, 또는 지나가는하고있는 무언가에 대한 새로운 블록을 생성하는 것을 피하기 싶지 않아 중간 변수를 만들지 않도록하는 것입니다. 이제 우리는 루비에서와 황조롱이이 있다고 가정하자 :

    implicit class RubyKestrel[A](val repr: A) extends AnyVal {
      def tap[B](f: A => B) = { f(repr); repr }
    }
    

    지금하자 우리가 코드의 일부 라인이 있다고 가정합니다 :

    xs.map(_ + 7).filter(foo).take(n)
    

    우리는 필터 후 디버깅 메시지를 출력합니다. 탭이 없다면 우리는 그 선을 리팩토링 :

    {
      val temp = xs.map(_ + 7).filter(foo)
      println(temp)
      temp.take(n)
    }
    

    윽. 이제 우리는 탭이 있다고 가정합니다 :

    xs.map(_ + 7).filter(foo).tap(println).take(n)
    

    휴, 더 좋은 방법!

    하자 우리가 추가 방법을 가지고 스택이 있다고 가정하고, 우리는 다른 곳에서 사용하기 전에 스택에 무언가를 추가하려고합니다.

    def newStack = {
      val stack = new Stack
      stack add "whatever"
      stack
    }
    

    윽. 그러나 탭과 :

    def newStack = (new Stack).tap(_ add "whatever")
    

    아주 편리합니다 - 그것은 정말 당신이 할 수 있습니다 체인 호출에 무언가로 어떤 정상 측면 초래 방법을 설정 할 수 있습니다. 그리고 이후 체인 호출은 종종 큰 승리입니다 종종 낮은 보일러입니다.

  2. from https://stackoverflow.com/questions/23231509/what-is-the-added-value-of-the-kestrel-functional-programming-design-pattern-s by cc-by-sa and MIT license