Data structures just are. They don`t do anything.
Joe Armstrong, Erlang creator.
Before immutablity...
Programs are just a collection of functions should:
Pure => never ever changing state/s == no side effects
Total => returns values for all inputs
Deterministic => returns the same result for the same input
4. Milstone => Referencial transparency = put all traits together
Data modeling OOP vs. FP approach
OOP <=> encapsulate/couples state and behaviour
class Status{
private int code;
private String statusMessage;
}
class Status (var code: Int, var statusMessage: String)
FP <=> decouple them.
case class Status(code: Int, statusMessage: String)
Data modeling FP approach
ADT - Algebraic Data Types
Where is the bridge between ADT:
1. Math => ¡Cardinality!
2. Immutablity => (Encapsulation by definition,
Isolation by single source of truth,
Immutable state of transfer)
"Good OOP is nothing more then FP in disguise."
"Design patterns are for fill the gap of the OOP abstractions lack."
"With the power paradigm you don`t need any framework for DI."
"In FP it is a common practice to compose and build computation pipelines
and defere evaluation until the end."
"In FP it is easy, and expected, to factor out common
functionality into generic, reusable components that can be composed each other."
But... Where IS the power of FP that we talk about?!
Everything is around Context!
The comprehension of for-comprehension expression
// This signature is only for the List
def flatMap[B](f: Int => List[B]): List[B]
5 Milstone => For-comprehension - a syntactic sugar for combination flatMap(s)/map together in a readable form
=> OOP Application is a squence of statmens written in imperative way
where each statments is changing the program state.
=> FP is a sequence of exrepssion written in declarative way
where each expression represent a chain of transfromation without any chunks of mutability
that could provoke hidden state change.