when programming imperatively, programmers often think of solving the problem in language categories. here i'd use an array, here i could use a pointer etc. funtion programming does not give programmer such tools. even more - thers is no such thing as variable.
function programming was invented by mathematicians. it's very simmilar to mathematical modelling of universe. solving a problem - writing an algorithm, is to define some absrtact form from simple (mathematical) objects, like numbers, sets, functions.
to show you some great abilities function programming gives the programmer it's good to think about everything as a function. even integers are functions! (please refer to Church numbers). now you can mix everything with everything and what you get might be also anything. function operating on funtions giving in result a function is common.
in my opinion, what's most cool when programming functions, is that code you create is clear and easy to understand. it makes debugging very simple. although solving a problem with functions might take a bit more time than imperatively. but you don't spend time on debugging. For instance it took me just an hour to write from a scrach AVL trees and test them. In C or C++ it would take at least twice that time.
if i interested you just a bit please refer to:
http://caml.inria.fr/
http://homepages.inf.ed.ac.uk/wadler/guide.html

