language is representation (data structures) and combination (control structures)
goals of a language: simplification => easy to express "what" it is you're trying to do
simplification => generalization
towards composability
goals of OOP
- compartmentalize code into reusable components
- accomplishes with state (mutable!) + behavior
goals of FP
- generalize behavior into reusable functions and apply state
- accomplishes with stateA -> behaviorA -> behaviorB -> behaviorC -> stateB
- to be composible, everything should return a value
the real world
often difficult to model in strict FP
scala provides both FP (preferred) mixed with OOP (+ some)