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)
...这是...的类型.
功能。
f
和g
的组合是一个函数,它首先将g
到它的参数,然后f
到g
返回的值。 然后它返回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