Maison >développement back-end >Tutoriel Python >Une monade est un monoïde dans la catégorie des endofoncteurs...

Une monade est un monoïde dans la catégorie des endofoncteurs...

Barbara Streisand
Barbara Streisandoriginal
2025-01-04 07:32:43700parcourir

A monad is a monoid in the category of endofunctors...

Qu'est-ce qu'une Monade ?

Une monade est un monoïde dans la catégorie des endofoncteurs... ?

...essayons encore :

Une monade est une abstraction utilisée en programmation fonctionnelle pour gérer les calculs de manière cohérente. Il s'agit d'un modèle de conception qui permet d'enchaîner les opérations tout en encapsulant les effets secondaires, tels que les changements d'état, les E/S ou les erreurs, de manière contrôlée.

Les monades peuvent être considérées comme un moyen d'envelopper des valeurs et de leur appliquer des fonctions, garantissant ainsi que les calculs sont effectués dans un environnement prévisible et contrôlé.

Ma compréhension personnelle est la suivante : une monade est une structure de données avec

  • une valeur (ou fonction) unique et immuable
  • une fonction map/bind pour mapper une fonction à cette valeur
  • une fonction de retour/aplatissement qui renvoie le nouvel état dans une nouvelle monade à chaque fois

Cela permet d'enchaîner et de composer les opérations de manière à préserver l'immuabilité et la pureté fonctionnelle : une approche "inverse" d'une classe, où l'état ne peut pas être modifié sur place, mais où les transformations sont appliquées fonctionnellement pour produire de nouvelles instances.

Cette « symétrie inversée » met en valeur le contraste :

  • Les classes modifient leur état interne, maintenant la mutabilité et l'interaction directe via des méthodes internes. Ils interagissent la plupart du temps avec un État global

  • Les monades atteignent des résultats similaires à ceux d'une classe, mais en encapsulant les valeurs et en mappant des transformations immuables externes, elles n'ont aucun effet secondaire : il n'y a pas d'état global

Exemple :

  • Classe : Une classe Box contient une valeur et vous pouvez modifier la valeur en appelant des méthodes comme setValue(newValue), qui mute l'état interne de la Box.
  • Monade : Un BoxMonad détiendrait une valeur de manière immuable. Pour transformer la valeur, vous utiliseriez une fonction comme map, qui applique une fonction externe à la valeur et renvoie un nouveau BoxMonad, avec la nouvelle valeur.

Exemple de projet en Python :
https://github.com/blackopsrepl/py-monad-task-manager

Dans cette application, nous utilisons la State Monad pour gérer l'état de la liste des tâches. La State Monad fournit un moyen de modéliser le processus de gestion des tâches comme une série de transformations sur l'état de l'application, tout en gardant l'état lui-même immuable.

Au lieu de modifier directement l'état de la liste des tâches, nous utilisons la fonction return_ pour envelopper l'état initial dans un conteneur monadique, et la fonction bind pour appliquer des transformations à l'état de manière prévisible. Chaque fois qu'une opération est effectuée (telle que l'ajout, la modification ou la suppression de tâches), elle renvoie une nouvelle instance de l'état, garantissant l'immuabilité et la composabilité.

Fonctions clés :

  • return_ : Encapsule une valeur dans un conteneur monadique, en l'intégrant à la chaîne de calcul monadique.
  • bind : applique une fonction à la valeur à l'intérieur de la monade, renvoyant un nouveau conteneur monadique avec la valeur transformée.

En utilisant State Monad, nous pouvons gérer les opérations de gestion des tâches de manière à garantir que l'état est mis à jour de manière immuable et que les calculs sont composés sans effets secondaires ni interactions indésirables entre les opérations.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn