수색…


다중 채널 기능 컴포지션

Arrow 는 모호한 말로, 일련의 구성과 "병렬 구성"둘 모두와 같이 기능을 구성하는 변종 클래스입니다. 함수의 일반화 로서 가장 흥미롭지 만, Arrow (->) 인스턴스 자체는 이미 매우 유용합니다. 예를 들어, 다음 함수는 :

spaceAround :: Double -> [Double] -> Double
spaceAround x ys = minimum greater - maximum smaller
 where (greater, smaller) = partition (>x) ys

화살표 결합 자로도 작성할 수 있습니다.

spaceAround x = partition (>x) >>> minimum *** maximum >>> uncurry (-)

이러한 종류의 구성은 다이어그램으로 시각화하는 것이 가장 좋습니다.

                       ──── minimum ────
                   ╱           *            ╲
──── partition (>x) >>>        *        >>>  uncurry (-) ───
                   ╲           *            ╱
                       ──── maximum ──── 

이리,

  • >>> 연산자 는 일반의 플립 버전입니다 . composition 연산자 (오른쪽에서 왼쪽으로 <<< 버전도 있습니다). 한 처리 단계에서 다음 처리 단계로 데이터를 파이프합니다.

  • 나가는 은 데이터 흐름이 두 개의 "채널"로 나뉘어져 있음을 나타냅니다. Haskell 타입의 관점에서, 이것은 튜플로 구현됩니다 :

    partition (>x) :: [Double] -> ([Double], [Double])
    

    두 개의 [Double] 채널에서 흐름을 분할하는 반면,

    uncurry (-) :: (Double,Double) -> Double
    

    두 개의 Double 채널을 병합합니다.

  • *** 는 병렬 구성 연산자입니다. maximumminimum 가 서로 다른 데이터 채널에서 독립적으로 작동 할 수 있습니다. 함수의 경우이 연산자의 서명은 다음과 같습니다.

    (***) :: (b->c) -> (β->γ) -> (b,β)->(c,γ)
    

적어도 Hask 범주 (즉, Arrow (->) 인스턴스)에서 f***g 는 실제로 서로 다른 스레드에서 fg 를 병렬로 계산하지 않습니다. 이론적으로 이것은 가능합니다.



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