私が見つけられない、これを行う標準ライブラリ関数があるかどうか知りたいです。
型クラスのために見逃しがちですが、を見てくださいControl.Arrow
。プレーンArrow
はカレーや塗布ができないので、Arrow
必然的にコンビネータは無意味です。あなたがそれらを専門にしているなら(->)
、あなたはあなたが望むものがこれであることがわかるでしょう:
(&&&) :: (Arrow a) => a b c -> a b c' -> a b (c, c')
の同等の操作など、他にも同様の機能があります。これは、Either
次(->)
のようになります。
(|||) :: (a -> c) -> (b -> c) -> Either a b -> c
これはと同じeither
です。
好奇心から、この関数をポイントフリー形式で書き直したいのですが、大変困っています。
入力を複製しているので、ポイントフリーでそれを行うための何らかの方法が必要です。最も一般的な方法は、たとえば、またはApplicative
インスタンスMonad
を使用することです。これは本質的に暗黙のインラインモナドであり、分割される引数は「環境」値です。このアプローチを使用すると、、、またはになり、になり、Sコンビネータになります。(->)
\f g -> (,)
<$> f <*> g
Reader
join f x
f x x
pure
return
const
fmap
(.)
(<*>)
\f g x -> f x (g x)