功能構成
函式組合運算子 (.)
定義為
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(.) f g x = f (g x) -- or, equivalently,
(.) f g = \x -> f (g x)
(.) f = \g -> \x -> f (g x)
(.) = \f -> \g -> \x -> f (g x)
(.) = \f -> (\g -> (\x -> f (g x) ) )
型別 (b -> c) -> (a -> b) -> (a -> c)
可以寫成 (b -> c) -> (a -> b) -> a -> c
,因為型別簽名中的 ->
關聯到右邊,對應於與左邊相關聯的函式應用程式,
f g x y z ... == (((f g) x) y) z ...
所以資料流是從右到左:x
進入g
,其結果進入 f
,產生最終結果:
(.) f g x = r
where r = f (g x)
-- g::a -> b
-- f :: b -> c
-- x::a
-- r :: c
(.) f g = q
where q = \x -> f (g x)
-- g::a -> b
-- f :: b -> c
-- q::a -> c
....
從語法上講,以下都是相同的:
(.) f g x = (f . g) x = (f .) g x = (. g) f x
這很容易被理解為“ 運算子部分的三個規則 ”,其中缺失的引數只是進入運算子附近的空槽:
(.) f g = (f . g) = (f .) g = (. g) f
-- 1 2 3
可以省略存在於等式兩側的 x
。這被稱為 eta 收縮。因此,寫下函式組合定義的簡單方法就是
(f . g) x = f (g x)
這當然是指論證x
; 每當我們在沒有 x
的情況下編寫 (f . g)
時,它就被稱為無點樣式。