サーチ…


複数チャンネルの機能構成

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チャンネルをマージします。

  • ***はパラレル合成オペレータです。それは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