Generation of approximations to differentiated functions **

Given a function `fr` from real numbers to real numbers. Program a higher-order function `derivative`, which dfferentiates a function like `fr`.

In this exercise you are asked to work numerically, in order to approximate the function. This stands as a contrast to symbolic differentiation.

As examples, `(derivative (lambda (x) (* x x)))` should behave (almost) as `(lambda (x) (* 2 x))`; `(derivate sin)` should behave almost as `cos`;
and `(derivate exp)` should behave almost like `exp` itself. Play with `derivative` to confirm these observations. (Map your functions over a number of numeric values, and compare...).

*The inspiration to the exercise comes from Christian Wagenknecht's book 'Programmierparadigmen', from Springer Verlag.*