链接多参数功能

时间:2013-02-18 18:31:47

标签: function haskell

假设我有两个函数f:X->Yg: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个参数,该怎么办?

3 个答案:

答案 0 :(得分:10)

使用right signature在Hoogle中搜索功能,从Data.Function中显示on。根据其文件,

g `on` f

似乎就是你想要的。

答案 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,可能有办法写on4on,但如果有,我现在看不到它。

答案 2 :(得分:6)

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

h g f a b = uncurry g ((f *** f) (a, b))

这相当于您的示例(gf不是免费的)和on。使用:

    {li>

    definition ***的功能:

    (***) f g ~(x,y) = (f x, g y)
    
  • uncurry的{​​{3}}:

    uncurry f p =  f (fst p) (snd p)
    

将它们代入原始等式:

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

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