Pascal is called an imperative language because programs written in it are recipes for `doing something'. If our programs consist only of functions, we can concentrate on what the results are and ignore how they're computed. Forget that sqrt is a piece of code and think of sqrt ( x ) as a way of writing a value in your program, and you'll get the idea. You can think of MaxOf3 like this as well if you ignore the way it works inside. By defining a `toolkit' of useful functions and combining them together like this, we can build powerful programs that are quite short and easy to understand.
In Pascal, functions can only return `simple' data objects such as numbers or characters, but real programs use big data structures and can't easily be written using these functions. In Hope, functions can return any type of value, including data structures equivalent to Pascal's arrays and records and much more. Programming in Hope has the flavour of simply `writing down the answer' by writing an expression that defines it. This will contain one or more function applications to define smaller parts of the answer. These functions won't usually be built in like sqrt, so we'll have to define them ourselves, but we'll still think of them as definitions of data objects, and not as algorithms for computing them.