Functions are not enough since functions are implementations. Haskell type classes on the other hand represent the kind of thinking being discussed here.
Totally agreed. I did not mean to imply all you need is functions. Just that Haskell allows for much more flexible and correct composition of software (especially when dealing with side effects) solving many of the issues in the OP without reflection and meta interface complexity. Not to say Haskell is perfect, just that I see this as a composition problem, not a failure of black box abstraction.