6

と の 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 つの引数を取る場合はどうなるでしょうか?

4

3 に答える 3

10

Hoogle で正しいシグネチャを持つ関数を検索すると、onData.Function から明らかになります。そのドキュメントによると、

g `on` f

あなたが望むもののようです。

于 2013-02-18T18:39:50.610 に答える
7

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との書き方もあるかもしれませんが、あるとすれon4on今のところ見当たりません。

于 2013-02-18T18:44:26.373 に答える
6

また、Arrowsもおもしろいと思うかもしれません。これを行う1つの方法は次のとおりです。

h g f a b = uncurry g ((f *** f) (a, b))

これはあなたの例と同等です(それを除いてgf無料ではありません)そしてon。使用:

  • 関数の定義***

    (***) f g ~(x,y) = (f x, g y)
    
  • 定義uncurry

    uncurry f p =  f (fst p) (snd p)
    

そして、それらを元の方程式に代入します。

  1. h g f a b = uncurry g (f a, f b) (使用され***た定義)

  2. h g f a b = g (f a) (f b) (使用されuncurryた定義)

于 2013-02-18T19:38:25.160 に答える