私が見つけられない、これを行う標準ライブラリ関数があるかどうか知りたいです。
型クラスのために見逃しがちですが、を見てください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 <*> gReaderjoin f xf x xpurereturnconstfmap(.)(<*>) \f g x -> f x (g x)