For example a quicksort written in Haskell will sort anything that < and <= are defined for. By contrast you have to write a different quicksort in C for every data type. That's parametric genericity.
For example a function in Haskell will always do the same thing when you call it. (Not actually true, but you're told when it is not true. Incidentally this is how you can have a pseudo-random number work in Haskell.) A function in C might do something else depending on a global variable that got changed in between.
And for higher order functions, the following piece of Perl demonstrates the idea:
nested_for(\n sub {print "@_\\n";},\n [1..2], ['a'..'c'], ['A'..'D']\n);\n\nsub nested_for {\n ret_iter(@_)->();\n}\n\nsub ret_iter {\n my $fn = shift;\n my $range = shift;\n my $sub = sub {$fn->($_, @_) for @$range};\n return @_ ? ret_iter($sub, @_) : $sub;\n}
Cheers,
Ben