>>8I sympathize with that view but I don't quite agree with the analysis. In sympathy, let me quote Perlis again:
“Some programming languages manage to absorb change, but withstand progress.” Scala is an amazing demonstration of that quote.
The analysis falls apart because we don't get to care what a function is made of. In the case of interoperation (with the platform or with the machine) we can't complain too much about some of those details leaking through. As long as Scala's functions are functions, regardless of whether they are also objects, they are still functions. In functional MOPs, objects are a function over lists of functions. In all universes, if you want to print something on the screen, you have to get imperative somewhere. (Monads? Monads allow you to write pure code, then to run the code in impure environments. It's not pure when it runs.)
A serious problem arises when you can't write functions, or can't write a solution in a functional way. A more common problem arises when you have an object you wish was a function, or a data type you wish you had a function of, instead of a method. This doesn't make the formulation non-functional, functional MOPs being FP everywhere even if it doesn't look like that in usage. This is the “enough rope to hang yourself” problem with abstraction, in a reasonable language you end up writing a second system. Technically the function can still be written, but the data could be encapsulated in another module, so you have to go through the interface provided.
In C++ the second system can be written but the syntax doesn't abstract as much as the semantics so at least there is some back-pressure.
Aside: you might think of a method as a kind of object in Smalltalk, but objects and methods are the kind of approximation you would see in Plato's cave. You should take messages as fundamental, because they're the only thing you can hold in your hands. You write messages in a way that describes objects and methods, but you never truly "write a method." You send messages to objects, but you only ever have objects to send messages to by sending messages to the environment or to other objects. All you have are messages and faith that the environment will respond with objects you can send more messages to. You could formalize message sends to objects as messages sent in a different environment and do away with any concrete notion of objects entirely.