This chapter presents a wide variety of code snippets implementing useful functions in different ways. These examples should serve to ossify the readers understanding of the F# language in order to prepare them for the complete example programs in chapter 12. Whilst describing these functions we endeavour to explain the relationships between the styles chosen and the information disseminated in the previous chapters of this book.
Many useful mathematical and scientific constructs can be encoded very elegantly by exploiting the features of functional programming. In the introduction, we saw a remarkably simple and yet powerful numerical derivative function. In this section, we shall examine more functions that will be useful to scientists using F#.
The nest function is found in many technical computing environments. This combi-nator nests applications of its function argument
f to a given value
x a given number of times
n. The nest function may be written:
> let rec nest n f x = match n with | 0 -> x | n -> nest (n - 1) f (f x);; val nest : int -> ('a -> 'a) -> 'a -> 'a
Note that we have phrased the recursive call to
nest such that it is tail recursive. An equivalent but non-tail-recursive implementation would have been
f(nest (n - 1) f x).
For example, in the context of the numerical derivative combinator
d and the example function f = x3 — x — 1 from section 1.6.4, the third derivative of
f may be written:
> let f''' = nest 3 d f;; val f''' : ...