I am reading this tutorial on Haskell. They define function composition as the following:
(.) :: (b->c) -> (a->b) -> (a->c) f . g = \ x -> f (g x)
No examples were provided, which I believe would enlighten me as to what is being defined here.
Can someone provide a simple example (with explanation) of how function composition is used?
A higher-order function is a function that takes other functions as arguments or returns a function as result.
The dollar sign, $ , is a controversial little Haskell operator. Semantically, it doesn't mean much, and its type signature doesn't give you a hint of why it should be used as often as it is. It is best understood not via its type but via its precedence.
The dot ( . ) is the Haskell operator for function composition. Function composition comes from mathematics but actually, it can be really useful to make music. Haskell was originally designed by mathematicians and computer magicians. Its syntax borrowed quite a lot from mathematical notation.
Haskell provides special syntax to support infix notation. An operator is a function that can be applied using infix syntax (Section 3.4), or partially applied using a section (Section 3.5).
Function composition is a way to "compose" two functions together into a single function. Here's an example:
Say you have these functions:
even :: Int -> Bool not :: Bool -> Bool
and you want to define your own myOdd :: Int -> Bool
function using the two above.
The obvious way to do this is the following:
myOdd :: Int -> Bool myOdd x = not (even x)
But this can be done more succinctly using function composition:
myOdd :: Int -> Bool myOdd = not . even
The myOdd
functions behave exactly the same, but the second one is created by "glue-ing" two functions together.
A scenario where this is especially useful is to remove the need for an explicit lambda. E.g:
map (\x -> not (even x)) [1..9]
can be rewritten to:
map (not . even) [1..9]
A bit shorter, less room for errors.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With