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) -> Double2つの
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