Higher order Functions
1 Parentheses!? atHome
Give examples for functions with the following types:
(Float −> Float) −> Float
Float −> (Float −> Float)
(Float −> Float) −> (Float −> Float)Give an example program p with the following type and explain how the function arrow -> associates:
p :: Int -> Bool -> IntGive examples of programs foo, bar and baz, such that foo bar baz type checks and please explain how function application associates.
Can you give examples of programs foo, bar and baz, such that one might expect foo bar baz to be well-typed if function application were to associate in the opposite direction, but such
that foo bar baz is in reality ill-typed?
2 Currying inClass
Please implement two functions
curry :: ((a, b) -> c) -> (a -> b -> c)
uncurry :: (a -> b -> c) -> ((a, b) -> c)Can you convince yourself that curry and uncurry are mutually inverse? Try it out on some example functions!
Please simplify the types of curry and uncurry by removing unnecessary parentheses
3 Filter atHome
The function filter can be defined in terms of concat and map:
filter p = concat . map box
where box x = _Complete the definition of box.
4 Function Composition atHome
Function composition first applies the latter of the supplied
functions to the argument, the former thereafter. Write a function
before that can be used to rewrite f . g . h to h `before` g `before` f. What can you say about associativity of (.) and
before?
5 Higher order data types atHome challenging
We have seen that [...] is a type function that maps types to
types. Similarly because −> is a type constructor mapping two types
to a type, for some c also c −> is a type function mapping a type
a to c −> a. Rewrite the type of map by substituting the type
function [...] by c −>. Can you derive an implementation from the
resulting type?