OOP:
- Everything is an object
- Inheritance (an object inherits all features of its class and super classes)
- Polymorphism (one object can replace another if the required class is one of its own or its super classes)
- Encapsulation (an object exposes only what it is meant to expose (black box))
FP:
- Functions can be used as values (therefore it is possible to write higher order functions)
- There is no state/variables, so that any function call with its input parameters define the result and can therefore be cached quite easily
So in theory it should be possible to combine the two concepts, but in my opinion it doesn't make much sense as they have different strengths and weaknesses (e.g. introducing state to FP is a very bad idea...).
Sadly many languages try to combine both concepts and implement both poorly and on the other hand there are too few people who actually understand the concepts and use them appropriately.
As a rule of thumb:
- Take OOP if you have to model the relationship and interaction between things (objects)
- Take FP if you have to calculate something (like Excel formulas do)