函数“.
”称为function composition,定义如下:
(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)
我们看到,函数f
接受函数g
的返回值作为参数。
函数复合以后返回一个函数f . g
,它的类型为a -> c
,a
是g
的入参类型,c
是f
的返回值类型。
例如:
<u></u>negate . (* 3)
返回一个函数,这个函数接受一个数字作为参数,乘以3然后取反。
函数复合的一种应用是动态创建一个复合函数,传递给其他高阶函数。虽然我们总是可以使用lambda来实现它,但是函数复合通常会更清晰简洁。
例如:
ghci> map (\x -> negate (abs x)) [5, -3, -6, 7]
[-5, -3, -6, -7]
因为\x -> negate (abs x) = negate . abs
,所以,我们可以改写为:
ghci> map (negate . abs) [5, -3, -6, 7]
[-5, -3, -6, -7]
函数复合是右结合的,所以我们可以一次复合多个函数。
f (g (z x)) = (f . g . z) x
注:
使用函数“$
”,还可以改写:
f (g x) = f $ g x = f $ g $ x
(f . g . z) x = f . g . z $ x
网友评论