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 ────
ここに、
>>>
演算子は、通常の反転されたバージョンです.
合成演算子(右から左を構成する<<<
バージョンもあります)。 1つの処理ステップから次の処理ステップにデータをパイプします。外に行く
╱
╲
データの流れを示しては、二つの「チャンネル」に分割されます。 Haskellの型に関して、これはタプルで実現されます:partition (>x) :: [Double] -> ([Double], [Double])
2つの
[Double]
チャンネルでフローを分割します。一方、uncurry (-) :: (Double,Double) -> Double
2つの
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