Let’s say for a moment that you are a lumberjack. You have the best axe in the forest, which makes you the most productive lumberjack in the camp.
Then one day someone shows up and extols the virtues of a new tree-cutting paradigm, the chainsaw. The sales guy is persuasive, so you buy a chainsaw, but you don’t know how it works.
Demonstrating your expertise with the previous tree-cutting paradigm, you swing it vigorously at a tree—without cranking it. You quickly conclude that this newfangled chainsaw is a fad, and you return to your axe.
Then, someone appears and shows you how to crank the chainsaw...
“Functional Thinking: Functional Programming using Java, Clojure and Scala”,
published by O‘Reilly.
Il faut donc utiliser un langage qui considère les fonctions comme des objets combinables : C#, Java 8+, Python, C++ 11, ...
=> On va utiliser javascript car il suffit d’un navigateur pour avoir un environnement de développement opérationnel !
Créer des fonctions
Quand on travaille avec des fonctions, on a parfois besoin de fabriquer des fonctions (en général avec moins d’arguments...)
function adder(x) {
return function(y) { return x+ y};
}
=> crée une fonction pour ajouter x
On parle de fonction d'ordre supérieur currifiée
Créer des fonctions
Particulièrement utile avec map et filter bien sûr
[1, 2, 3, 4].map(adder(2)) => [3, 4, 5, 6]
[1, 2, 3, 4].filter(isModulo(2)) => [2, 4]
people
.filter(hasNameStartingWith('C'))
.map(extractName)
.forEach(display)
Créer des fonctions :exercice
var NASDAQ = [
{name: "ANGI", price: 31.22, stamp: new Date(2011,11,15) },
{name: "MSFT", price: 32.32, stamp: new Date(2011,11,15) },
{name: "GOOG", price: 150.43, stamp: new Date(2011,11,15)},
{name: "ANGI", price: 28.44, stamp: new Date(2011,11,16)},
{name: "GOOG", price: 199.33, stamp: new Date(2011,11,16)}
];
Afficher le prix des actions de X (ex: "GOOG" ) en date du Z (ex: 2011-11-16)
comparer 2 dates en JS :
d1.getTime() == d2.getTime()
Créer des fonctions :exercice
DSL
Les classes en JS
DSL : exercice
DSL : exercice
DSL : en vrai !
Dans un "vrai" langage fonctionnel, les parenthèses, les virgules, les points et les new sont optionnels (le compilateur les déduit)
new Prices(NASDAQ).of("GOOG").at(2011,11,16)
Est équivalent à
Prices NASDAQ of "GOOG" at 2011 11 16
=> c’est quasiment de l’anglais !!!
Autres utilisations ?
Autres utilisations ?
.map(e => e.target.value) //retenir la valeur du champ texte
.filter(q => q.length > 2) //seulement si au moins 3 caractères .distinctUntilChanged() //seulement si différent du précédent .flatMapLatest(searchAndDisplay) //et envoyer le dernier à la fonction