假设我有两个函数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个参数,该怎么办?
答案 0 :(得分:10)
答案 1 :(得分: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
根据on3
,可能有办法写on4
和on
,但如果有,我现在看不到它。
答案 2 :(得分:6)
您可能还会发现箭头很有趣。这是一种方法:
h g f a b = uncurry g ((f *** f) (a, b))
这相当于您的示例(g
和f
不是免费的)和on
。使用:
definition ***
的功能:
(***) f g ~(x,y) = (f x, g y)
uncurry
的{{3}}:
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
定义)