本文内容来自 "Point-Free or Die: Tacit Programming in Haskell and Beyond" by Amar Shah
Point-Free
\x -> outside (inside x)
\x -> outside $ inside x
\x -> outside . inside $ x
outside . inside
aggregate
totalNumber = sum . map length
totalNumber = aggregate length
where aggregate f = sum . map f
eta-abstraction
An eta-abstraction is adding of abstraction over a function.aggregate f = sum . map f
aggregate f xs = sum . map f $ xs
aggregate f xs = sum $ map f xs
aggregate f xs = sum (map f xs)
eta-reduction
An eta-reduction is dropping of abstraction over a function.aggregate f = sum . map f
aggregate f = (.) sum (map f)
aggregate f = (.) sum $ map f
aggregate f = (.) sum . map $ f
aggregate = \f -> (.) sum . map $ f
aggregate = (.) sum . map
aggregate = (sum .) . map
combinator
A combinator is a function with no free variables, that is, a pure lambda-expression that refers only to its arguments.\f g -> (f .) . g
\f g x -> (f .) . g $ x
\f g x -> (f .) $ g x
\f g x -> (f .) (g x)
\f g x -> f . g x
\f g x y -> f . g x $ y
\f g x y -> f $ g x y
\f g x y -> f (g x y)
黑鸟(blackbird)组合运算符 (...)
The blackbird combinator is the composition of composition and composition.f ... g = (f .) . g
f ... g = \x y -> f (g x y)
f ... g = \x y -> f $ g x y
f ... g = \x y -> f . g x $ y
f ... g = \x -> (.) f (g x)
f ... g = \x -> (.) f $ g x
f ... g = \x -> (.) f . g $ x
f ... g = (.) f . g
f ... g = (f .) . g
(...) = (.) . (.)
(...) = \f g -> (f .) . g
(...) = \f g -> (.) f . g
(...) = \f g -> (.) (f .) $ g
(...) = \f -> (.) (f .)
(...) = \f -> (.) ((.) f)
(...) = \f -> (.) $ (.) f
(...) = \f -> (.) . (.) $ f
(...) = (.) . (.)
aggregate f xs = sum (map f xs)
aggregate = sum ... map
(...) 与 (.)
f . g = \x -> f (g x)
f ... g = \x y -> f (g x y)
f ... g = (f .) . g
(...) = (.) . (.)
三个参数的情况
\x y z = f (g x y z)
\x y z = f . (g x y) $ z
\x y = f . (g x y)
\x y = (f .) . (g x) $ y
\x = (f .) . (g x)
\x = ((f .) .) g $ x
((f .) .) . g
\f g = ((f .) .) . g
\f g = (.) ((f .) .) g
\f g = (.) . ((f .) .) $ g
\f = (.) . ((f .) .)
\f = (.) . ((.) ((.) f))
\f = (.) . (.) . (.) $ f
(.) . (.) . (.)
(.....)= (.) . (.) . (.)