"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Introduction à la programmation fonctionnelle en JavaScript : Monade et foncteurs #7

Introduction à la programmation fonctionnelle en JavaScript : Monade et foncteurs #7

Publié le 2024-07-29
Parcourir:180

Introduction to Functional Programming in JavaScript: Monad and functors #7

Les monades et les foncteurs sont des concepts avancés de la programmation fonctionnelle qui fournissent des abstractions puissantes pour gérer les transformations de données, les effets secondaires et la composition. Bien qu'ils proviennent de la théorie des catégories en mathématiques, ils ont des applications pratiques dans des langages de programmation comme JavaScript.

Qu'est-ce qu'un foncteur ?

Un foncteur est un type de données qui implémente une méthode map, qui applique une fonction à la valeur à l'intérieur du foncteur et renvoie un nouveau foncteur avec la valeur transformée. Essentiellement, les foncteurs vous permettent d'appliquer une fonction à une valeur encapsulée sans modifier la structure du conteneur.

Exemple de foncteur
class Box {
  constructor(value) {
    this.value = value;
  }

  map(fn) {
    return new Box(fn(this.value));
  }
}

// Usage
const box = new Box(2);
const result = box.map(x => x   3).map(x => x * 2);
console.log(result); // Box { value: 10 }

Dans cet exemple, Box est un foncteur. La méthode map applique la fonction fn à la valeur à l'intérieur de la boîte et renvoie une nouvelle boîte avec la valeur transformée.

Qu'est-ce qu'une Monade ?

Une monade est un type de foncteur qui implémente deux méthodes supplémentaires : of (ou return dans certains langages) et flatMap (également appelé bind ou chain). Les monades fournissent un moyen d'enchaîner les opérations sur la valeur contenue tout en conservant le contexte de la monade.

Propriétés des monades
  1. Unit (of) : une méthode qui prend une valeur et renvoie une monade contenant cette valeur.
  2. Bind (flatMap) : une méthode qui prend une fonction renvoyant une monade et l'applique à la valeur contenue, aplatissant le résultat.
Exemple de monade
class Box {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Box(value);
  }

  map(fn) {
    return Box.of(fn(this.value));
  }

  flatMap(fn) {
    return fn(this.value);
  }
}

// Usage
const box = Box.of(2);
const result = box
  .flatMap(x => Box.of(x   3))
  .flatMap(x => Box.of(x * 2));
console.log(result); // Box { value: 10 }

Dans cet exemple, Box est à la fois un foncteur et une monade. La méthode of encapsule une valeur dans une boîte et la méthode flatMap applique une fonction à la valeur contenue et renvoie la monade résultante.

Cas d'utilisation pratique des monades et des foncteurs

Les monades et les foncteurs ne sont pas de simples constructions théoriques ; ils ont des applications pratiques dans la programmation du monde réel. Explorons quelques cas d'utilisation courants.

Gestion des valeurs facultatives avec Maybe Monad

La monade Maybe est utilisée pour gérer les valeurs facultatives, en évitant les valeurs nulles ou non définies et en fournissant un moyen sûr d'enchaîner les opérations.

class Maybe {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Maybe(value);
  }

  isNothing() {
    return this.value === null || this.value === undefined;
  }

  map(fn) {
    return this.isNothing() ? this : Maybe.of(fn(this.value));
  }

  flatMap(fn) {
    return this.isNothing() ? this : fn(this.value);
  }
}

// Usage
const maybeValue = Maybe.of('hello')
  .map(str => str.toUpperCase())
  .flatMap(str => Maybe.of(`${str} WORLD`));
console.log(maybeValue); // Maybe { value: 'HELLO WORLD' }

Dans cet exemple, la monade Maybe gère en toute sécurité la valeur facultative, autorisant les transformations uniquement si la valeur n'est pas nulle ou indéfinie.

Gestion des opérations asynchrones avec Promise Monad

Les promesses en JavaScript sont des monades qui gèrent les opérations asynchrones, offrant ainsi un moyen d'enchaîner les opérations et de gérer les erreurs.

const fetchData = url => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`Data from ${url}`);
    }, 1000);
  });
};

// Usage
fetchData('https://api.example.com')
  .then(data => {
    console.log(data); // 'Data from https://api.example.com'
    return fetchData('https://api.example.com/2');
  })
  .then(data => {
    console.log(data); // 'Data from https://api.example.com/2'
  })
  .catch(error => {
    console.error(error);
  });

Les promesses vous permettent de gérer les opérations asynchrones de manière propre et composable, en enchaînant les opérations et en gérant les erreurs avec élégance.

Les monades et les foncteurs sont de puissantes abstractions de la programmation fonctionnelle qui vous permettent de travailler avec les transformations de données, les effets secondaires et la composition de manière plus structurée et prévisible.

Bien que les fondements mathématiques des monades et des foncteurs puissent être complexes, leurs applications pratiques sont très précieuses dans la programmation du monde réel. Que vous gériez des valeurs facultatives avec la monade Maybe ou que vous gériez des opérations asynchrones avec Promises, ces techniques de programmation fonctionnelle peuvent vous aider à créer des applications plus robustes et plus fiables.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/francescoagati/introduction-to-functional-programming-in-javascript-monad-and-functors-7-1l6l?1 En cas de violation, veuillez contacter study_golang@163 .com pour le supprimer
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3