Découvrez ce paradigme à travers son modèle de pensée et non ses outils. Une présentation accessible à tous, garantie sans jargon ou concepts complexes pour un usage du fonctionnel au quotidien quelque soit votre langage.
immédiatement un résultat à une constante : const result = heavy_process(some, args); const lazy_result = () => heavy_process(some, args); Celui-ci est placé dans une fonction exécutée au moment opportun (qui peut ne jamais arriver) :
manipuler les fonction comme des valeurs = fonctions d’ordre supérieures const pow = x => y => y ** x; const pow3 = pow(3); console.log(pow3(3)); //print 27
l’inverse Un langage fonctionnel pourra toujours exprimer la notion « d’objet », mais un langage objet ne garantie pas la possibilité d’utiliser un style fonctionnel (La plupart des langages possèdent maintenant des constructions fonctionnelles)
different types of objects: those containing only data, which are things I share with JSON; and things containing only methods, which are things I can share with applications »
« complexes » La poo repose sur des structures de données « intelligentes » Le style fonctionnelle utilise très peu de type différents manipulé par des fonctions génériques circle = Circle.new(5, 7, 15) circle.move(3, 10) circle.scale(20) circle = [5, 7, 15] move_to(circle, 3, 10) scale(circle, 20)
venir appliquer du comportement La closure est une « inverse » d’objet Une closure est du comportement qui attend de la donnée circle = Circle.new(5, 7, 15) circle.move(3, 10) move_to_parametrized = ->(x, y) { -> (circle) { move_to(circle, x, y) }} circle = [5, 7, 15] move_to_5_15 = move_to_parametrized(5, 15); move_to_5_15(circle)
données type 'a tree = | Node of 'a tree * 'a * 'a tree | Leaf;; let rec fold_tree f a t = match t with | Leaf -> a | Node (l, x, r) -> f x (fold_tree f a l) (fold_tree f a r);; Le pattern matching permet d’adapter un comportement en se basant sur la structure ou le type de la donnée
structures de données nommées Les types en Orienté Objet, le typage « nominatif » Il n’y a pas de différence entre la « forme » de la donnée et ses comportements circle = Circle.new(5, 7, 15) circle.move(3, 10) circle.scale(20) Deux types sont égaux si ils portent le même nom
forme » (une structure) de donnée Les types en fonctionnel, le typage structurel Toute fonction acceptant une pair d’entier sera compatible avec ce type type pair_of_ints = { a : int; b : int };;
sommes de types Les types en fonctionnelle, le typage algébrique type Suit = Spades | Hearts | Clubs | Diamonds type Rank = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | Ace type Card = Rank * Suit type Deck = Card list
associés et en permettant la combinaison de type, les langages fonctionnels permettent de représenter plus facilement des situations métiers plus complexes
l’état d’un objet, retournez un nouvel objet class Circle def initialize r, x, y @r = r @x = x @y = y end def move x, y Circle.new(@r, @x + x, @y + y) end end