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