と の 2 つの関数があるf:X->Y
としg:Y*Y->Z
ます。3 つ目の関数を作成したいと思いh(a, b) = g(f(a), f(b))
ます。
h a b = g (f a) (f b)
のように書く方法はありますh(a, b) = g*f (a, b)
か?
そして、h(a,b,c,d) = g2*g1*f2*f1 (a,b,c,d)
、 whereg_i
が 2 つの引数を取る場合はどうなるでしょうか?
on
コンビネータ(別のData.Function
回答で gspr によって指摘されているように)は、によって定義されます
g `on` f = \x y -> g (f x) (f y)
あなたが書くことを可能にするだろう
h = g `on` f
これを高次元で一般化できます。たとえば、
g `on3` f = \x y z -> g (f x) (f y) (f z)
g `on4` f = \w x y z -> g (f w) (f x) (f y) (f z)
あなたが書くことができるように
h = g `on3` f
on3
との書き方もあるかもしれませんが、あるとすれon4
ばon
今のところ見当たりません。
また、Arrowsもおもしろいと思うかもしれません。これを行う1つの方法は次のとおりです。
h g f a b = uncurry g ((f *** f) (a, b))
これはあなたの例と同等です(それを除いてg
、f
無料ではありません)そしてon
。使用:
そして、それらを元の方程式に代入します。
h g f a b = uncurry g (f a, f b)
(使用され***
た定義)
h g f a b = g (f a) (f b)
(使用されuncurry
た定義)