2013-02-18 116 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定義)