假设我有两个函数,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), whereg_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和. 使用:fon
并将它们代入原始方程:
h g f a b = uncurry g (f a, f b) (使用***定义)
h g f a b = g (f a) (f b) (使用uncurry定义)