Haskell Language
화살
수색…
다중 채널 기능 컴포지션
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
채널을 병합합니다.***
는 병렬 † 구성 연산자입니다.maximum
및minimum
가 서로 다른 데이터 채널에서 독립적으로 작동 할 수 있습니다. 함수의 경우이 연산자의 서명은 다음과 같습니다.(***) :: (b->c) -> (β->γ) -> (b,β)->(c,γ)
† 적어도 Hask 범주 (즉, Arrow (->)
인스턴스)에서 f***g
는 실제로 서로 다른 스레드에서 f
와 g
를 병렬로 계산하지 않습니다. 이론적으로 이것은 가능합니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow