The more functional programming I do, the more I feel like it adds an extra layer of abstraction that seems like how an onion's layer is- all encompassing of the previous layers.I don't know if this is true so going off the OOP principles I've worked with for years, can anyone explain how functional does or doesn't accurately depict any of them: Encapsulation, Abstraction, Inheritance, PolymorphismI think we can all say, yes it has encapsulation via tuples, or do tuples count technically as fact of functional programming or are they just a utility of the language?I know Haskell can meet the interfaces requirement, but again not certain if it's method is a fact of functional? I'm guessing that the fact that functors have a mathematical basis you could say those are a definite built in expectation of functional, perhaps?Please, detail how you think functional does or does not fulfill the 4 principles of OOP.Edit:I understand the differences between the functional paradigm and object oriented paradigm just fine and realize there are plenty of multiparadigm languages these days which can do both. I am really just looking for definitions of how outright fp (think purist, like haskell) can do any of the 4 things listed, or why it cannot do any of them. i.e. Encapsulation can be done with closures (or if I am wrong in this belief, please state why).
Is functional programming a superset of object oriented?
object oriented;functional programming
Functional programming isn't a layer above OOP; it's a completely different paradigm.  It's possible to do OOP in a functional style (F# was written for exactly this purpose), and on the other end of the spectrum you have stuff like Haskell, which explicitly rejects the principles of object orientation.You can do encapsulation and abstraction in any language advanced enough to support modules and functions.  OO provides special mechanisms for encapsulation, but it's not something inherent to OO.  The point of OO is the second pair you mentioned: inheritance and polymorphism.  The concept is formally known as Liskov substitution, and you can't get it without language-level support for object-oriented programming.  (Yes, it's possible to fake it in some cases, but you lose a lot of the advantages that OO brings to the table.)Functional programming doesn't focus on Liskov substitution.  It focuses on increasing the level of abstraction, and on minimizing the use of mutable state and routines with side effects, which is a term functional programmers like to use to make routines that actually do something (as opposed to simply calculating something) sound scary.  But again, they're completely separate paradigms, that can be used together, or not, depending on the language and the skill of the programmer.