Haskell函数组成

我正在阅读关于Haskell的这篇教程。 他们将功能组成定义如下:

(.)                     :: (b->c) -> (a->b) -> (a->c)
f . g                   =  x -> f (g x)

没有提供任何例子,我相信这些例子会让我对这里定义的内容有所启发。

有人可以提供一个简单的例子(解释)如何使用函数组合?


功能组合是将两个功能“组合”为一个功能的一种方式。 这是一个例子:

假设你有这些功能:

even :: Int -> Bool
not :: Bool -> Bool

你想用上面的两个定义你自己的myOdd :: Int -> Bool函数。

明显的做法如下:

myOdd :: Int -> Bool
myOdd x = not (even x)

但是这可以通过使用函数组合来更简洁地完成:

myOdd :: Int -> Bool
myOdd = not . even

myOdd函数的行为完全相同,但第二个函数是通过将两个函数“粘合”在一起而创建的。

一个特别有用的场景是消除对显式lambda的需求。 例如:

map (x -> not (even x)) [1..9]

可以重写为:

map (not . even) [1..9]

有点短,错误的空间更小。


乐趣方面的说明。 函数组合等同于逻辑中的三段论:

所有的人都是凡人。 苏格拉底是一个男人。 因此,苏格拉底是致命的。

三段论将两个材料含义合成为一个:

(Man => Mortal), (Socrates => Man), therefore (Socrates => Mortal)

因此...

(b -> c) -> (a -> b) -> (a -> c)

...这是...的类型. 功能。


fg的组合是一个函数,它首先将g到它的参数,然后fg返回的值。 然后它返回f的返回值。

这个身份可能是有启发性的:

f (g x) = (f . g) x

如果您有Java / C背景,请考虑以下示例:

int f(int x);
int g(int x);
int theComposition(int x) { return f(g(x)); }
链接地址: http://www.djcxy.com/p/80719.html

上一篇: Haskell function composition

下一篇: Uses for Haskell id function