6

假设我有两个函数,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 个参数呢?

4

3 回答 3

10

从 Data.Function中搜索 Hoogle 以查找具有正确签名on的函数。根据其文件,

g `on` f

似乎是你想要的。

于 2013-02-18T18:39:50.610 回答
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

可能有一种方法可以写on3on4on但如果有的话,我现在看不到。

于 2013-02-18T18:44:26.373 回答
6

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

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

这相当于你的例子(除了那个不是免费的)g和. 使用:fon

  • ***for函数的定义:

    (***) f g ~(x,y) = (f x, g y)
    
  • 定义uncurry

    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定义)

于 2013-02-18T19:38:25.160 回答