假設我有兩個函數,f:X->Y
和g: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個參數?
假設我有兩個函數,f:X->Y
和g: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個參數?
的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
方面的一種方式,但如果我不能看到它的那一刻。
您可能還會發現箭頭有趣。下面是做這件事:
h g f a b = uncurry g ((f *** f) (a, b))
即相當於你的榜樣(除了g
和f
是不是免費的)和on
。使用:
的***
definition的功能:
(***) f g ~(x,y) = (f x, g y)
definitionuncurry
的:
uncurry f p = f (fst p) (snd p)
而以他們爲原來的公式:
h g f a b = uncurry g (f a, f b)
(使用***
定義)
h g f a b = g (f a) (f b)
(使用uncurry
定義)
您的兩個例子是不同步的。第一個應該是'g(f1 a)(f2 b)'或第二'g(f a)(f b)(f c)(f d)'。 – 2013-02-18 18:38:45
你可以寫成h = \ a b - > g(f a)(f b)'作爲h =(.f)。 G 。 f',但你不應該(可讀性)。 – 2013-02-18 18:40:12
在你的新第二個例子中,你的意思是'f'函數使用'arg,'g' funcs取2?然後你需要第三級。你能完全寫出來嗎? – 2013-02-18 18:59:23