I really like the concept of "compression oriented programming" that Casey outlines here. You write an imperative program and make functions and objects as "compressions" of your original code, where suitable. That way you don't end up with a jungle of objects, and, on the other hand, don't start constructing monads or producing hundreds of tiny functions just for the ideology of it all.