假设我有两个函数,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