链接多参数功能

cri*_*der 6 haskell function

假设我有两个功能,f:X->Y并且g:Y*Y->Z.我想做第三个功能,h(a, b) = g(f(a), f(b)).

h a b = g (f a) (f b)
Run Code Online (Sandbox Code Playgroud)

有什么方法可以写出来h(a, b) = g*f (a, b)吗?

如果h(a,b,c,d) = g2*g1*f2*f1 (a,b,c,d),在哪里g_i需要2个参数?

gsp*_*spr 10

搜索Hoogle的功能与正确的签名揭示了on从Data.Function.根据其文件,

g `on` f
Run Code Online (Sandbox Code Playgroud)

似乎是你想要的.


Chr*_*lor 7

所述on组合子(在Data.Function,如在另一个答案指出的GSPR)由下式定义

g `on` f = \x y -> g (f x) (f y)
Run Code Online (Sandbox Code Playgroud)

这将允许你写

h = g `on` f
Run Code Online (Sandbox Code Playgroud)

例如,您可以对此进行更高维的概括

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)
Run Code Online (Sandbox Code Playgroud)

这样你就可以写了

h = g `on3` f
Run Code Online (Sandbox Code Playgroud)

可能有一种写作on3on4方式on,但如果有,我现在看不到它.


Mat*_*ick 6

您可能还会发现箭头很有趣.这是一种方法:

h g f a b = uncurry g ((f *** f) (a, b))
Run Code Online (Sandbox Code Playgroud)

这相当于你的例子(除了g并且f不是免费的)和on.使用:

并将它们代入原始等式:

  1. h g f a b = uncurry g (f a, f b) (使用的***定义)

  2. h g f a b = g (f a) (f b) (使用的uncurry定义)