2013-02-18 72 views
6

假设我有两个函数,f:X->Yg:Y*Y->Z。 我想做第三个功能,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),其中g_i需要2个参数?

+0

您的两个例子是不同步的。第一个应该是'g(f1 a)(f2 b)'或第二'g(f a)(f b)(f c)(f d)'。 – 2013-02-18 18:38:45

+0

你可以写成h = \ a b - > g(f a)(f b)'作为h =(.f)。 G 。 f',但你不应该(可读性)。 – 2013-02-18 18:40:12

+0

在你的新第二个例子中,你的意思是'f'函数使用'arg,'g' funcs取2?然后你需要第三级。你能完全写出来吗? – 2013-02-18 18:59:23

回答

10

通过right signature从Hoogle搜索函数中找到来自Data.Function的on。根据其文件,

g `on` f 

似乎是你想要的。

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 

有可能是写on3on4on方面的一种方式,但如果我不能看到它的那一刻。

6

您可能还会发现箭头有趣。下面是做这件事:

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

即相当于你的榜样(除了gf是不是免费的)和on。使用:

  • ***definition的功能:

    (***) f g ~(x,y) = (f x, g y) 
    
  • definitionuncurry的:

    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定义)