Basically he means that you have functions whose parameters can be of many different types, functions do the same thing every time you give them the same parameters, and there are functions that take or receive other functions as arguments.

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