On parle beaucoup de monades ces jours-ci. J'ai lu quelques articles / billets de blog, mais je ne peux pas aller assez loin avec leurs exemples pour saisir pleinement le concept. La raison en est que les monades sont un concept de langage fonctionnel, et donc les exemples sont dans des langages avec lesquels je n'ai pas travaillé (puisque je n'ai pas utilisé un langage fonctionnel en profondeur). Je ne peux pas saisir la syntaxe assez profondément pour suivre les articles complètement ... mais je peux dire qu'il y a quelque chose qui vaut la peine d'être compris.
Cependant, je connais assez bien C #, y compris les expressions lambda et d'autres fonctionnalités fonctionnelles. Je sais que C # n'a qu'un sous-ensemble de fonctionnalités fonctionnelles, et donc peut-être que les monades ne peuvent pas être exprimées en C #.
Cependant, il est sûrement possible de transmettre le concept? Du moins je l'espère. Vous pouvez peut-être présenter un exemple C # comme base, puis décrire ce qu'un développeur C # souhaiterait pouvoir faire à partir de là, mais ne peut pas parce que le langage manque de fonctionnalités de programmation fonctionnelles. Ce serait fantastique, car cela transmettrait l'intention et les avantages des monades. Alors, voici ma question: quelle est la meilleure explication que vous pouvez donner des monades à un développeur C # 3?
Merci!
(EDIT: Au fait, je sais qu'il y a déjà au moins 3 questions "qu'est-ce qu'une monade" sur SO. Cependant, je suis confronté au même problème avec eux ... donc cette question est nécessaire imo, à cause du développeur C # focus. Merci.)
Réponses:
La plupart de ce que vous faites dans la programmation toute la journée consiste à combiner certaines fonctions pour en créer de plus grandes. Habituellement, vous avez non seulement des fonctions dans votre boîte à outils, mais aussi d'autres choses comme des opérateurs, des affectations de variables et autres, mais généralement votre programme combine de nombreux "calculs" à des calculs plus importants qui seront combinés plus loin.
Une monade est un moyen de faire cette "combinaison de calculs".
Habituellement, votre "opérateur" le plus élémentaire pour combiner deux calculs est
;
:Lorsque vous dites cela, vous voulez dire «d'abord faire
a
, puis faireb
». Le résultata; b
est à nouveau un calcul qui peut être combiné avec plus de choses. C'est une simple monade, c'est une façon de combiner de petits calculs à de plus grands. Le;
dit "faites la chose à gauche, puis faites la chose à droite".Une autre chose qui peut être considérée comme une monade dans les langages orientés objet est le
.
. Vous trouvez souvent des choses comme ceci:Le
.
signifie fondamentalement "évaluer le calcul sur la gauche, puis appeler la méthode sur la droite sur le résultat de cela". C'est une autre façon de combiner fonctions / calculs ensemble, un peu plus compliqué que;
. Et le concept de chaîner des choses avec.
est une monade, car c'est une façon de combiner deux calculs ensemble en un nouveau calcul.Une autre monade assez courante, qui n'a pas de syntaxe particulière, est ce modèle:
Une valeur de retour de -1 indique un échec, mais il n'existe aucun moyen réel d'abstraire cette vérification d'erreurs, même si vous avez beaucoup d'appels API que vous devez combiner de cette manière. Il s'agit simplement d'une autre monade qui combine les appels de fonction par la règle "si la fonction de gauche renvoie -1, renvoie -1 nous-mêmes, sinon appelle la fonction de droite". Si nous avions un opérateur
>>=
qui faisait cette chose, nous pourrions simplement écrire:Cela rendrait les choses plus lisibles et aiderait à faire abstraction de notre façon spéciale de combiner des fonctions, de sorte que nous n'ayons pas besoin de nous répéter encore et encore.
Et il existe de nombreuses autres façons de combiner des fonctions / calculs qui sont utiles en tant que modèle général et peuvent être abstraites dans une monade, permettant à l'utilisateur de la monade d'écrire un code beaucoup plus concis et clair, puisque toute la comptabilité et la gestion de les fonctions utilisées se font dans la monade.
Par exemple, ce qui précède
>>=
pourrait être étendu pour "faire la vérification des erreurs, puis appeler le côté droit du socket que nous avons obtenu en entrée", afin que nous n'ayons pas besoin de spécifier explicitementsocket
beaucoup de fois:La définition formelle est un peu plus compliquée car vous devez vous soucier de savoir comment obtenir le résultat d'une fonction en tant qu'entrée de la suivante, si cette fonction a besoin de cette entrée et que vous voulez vous assurer que les fonctions que vous combinez correspondent la façon dont vous essayez de les combiner dans votre monade. Mais le concept de base est simplement que vous formalisez différentes manières de combiner des fonctions.
la source
;
exemple: Quels objets / types de données sont;
mappés? (PensezList
cartesT
àList<T>
) Comment;
carte morphisme / fonctions entre les objets / types de données? Qu'est - cepure
,join
,bind
pour;
?Cela fait un an que j'ai posté cette question. Après l'avoir posté, je me suis plongé dans Haskell pendant quelques mois. Je l'ai énormément apprécié, mais je l'ai mis de côté juste au moment où j'étais prêt à me plonger dans les Monades. Je suis retourné au travail et me suis concentré sur les technologies dont mon projet avait besoin.
Et hier soir, je suis venu et j'ai relu ces réponses. Plus important encore , j'ai relu l'exemple spécifique C # dans les commentaires de texte de la vidéo de Brian Beckman que quelqu'un mentionne ci-dessus . C'était tellement clair et éclairant que j'ai décidé de l'afficher directement ici.
A cause de ce commentaire, non seulement j'ai l'impression de comprendre exactement ce que sont les Monades… Je me rends compte que j'ai en fait écrit des choses en C # qui sont des Monades… ou du moins très proches, et je m'efforce de résoudre les mêmes problèmes.
Alors, voici le commentaire - tout cela est une citation directe du commentaire ici par sylvan :
la source
Une monade est essentiellement un traitement différé. Si vous essayez d'écrire du code qui a des effets secondaires (par exemple E / S) dans un langage qui ne les autorise pas, et n'autorise que le calcul pur, une esquive consiste à dire: "Ok, je sais que vous ne ferez pas d'effets secondaires pour moi, mais pouvez-vous s'il vous plaît calculer ce qui se passerait si vous le faisiez? "
C'est une sorte de triche.
Maintenant, cette explication vous aidera à comprendre l'intention globale des monades, mais le diable est dans les détails. Comment faire exactement vous calculer les conséquences? Parfois, ce n'est pas joli.
La meilleure façon de donner un aperçu de la façon dont une personne habituée à la programmation impérative est de dire qu'elle vous met dans un DSL dans lequel des opérations qui ressemblent syntaxiquement à ce à quoi vous êtes habitué en dehors de la monade sont utilisées à la place pour construire une fonction qui ferait. ce que vous voulez si vous pouviez (par exemple) écrire dans un fichier de sortie. Presque (mais pas vraiment) comme si vous construisiez du code dans une chaîne à évaluer plus tard.
la source
Maybe
etEither e
) et la gestion des états (State s
,ST s
) me semblent des instances particulières de "Veuillez calculer ce qui se passerait si vous faisiez [effets secondaires pour moi]". Un autre exemple serait le non-déterminisme ([]
).Je suis sûr que d'autres utilisateurs publieront en profondeur, mais j'ai trouvé cette vidéo utile dans une certaine mesure, mais je dirai que je ne suis toujours pas au point de maîtriser le concept de sorte que je pourrais (ou devrais) commencer à résoudre problèmes intuitivement avec les Monades.
la source
Vous pouvez considérer une monade comme un C #
interface
que les classes doivent implémenter . C'est une réponse pragmatique qui ignore toute la catégorie mathématique théorique derrière pourquoi vous voudriez choisir d'avoir ces déclarations dans votre interface et ignore toutes les raisons pour lesquelles vous voudriez avoir des monades dans un langage qui essaie d'éviter les effets secondaires, mais j'ai trouvé que c'était un bon début en tant que personne qui comprend les interfaces (C #).la source
Voir ma réponse à "Qu'est-ce qu'une monade?"
Il commence par un exemple motivant, fonctionne à travers l'exemple, dérive un exemple de monade et définit formellement «monade».
Il ne suppose aucune connaissance de la programmation fonctionnelle et utilise un pseudocode avec une
function(argument) := expression
syntaxe avec les expressions les plus simples possibles.Ce programme C # est une implémentation de la monade pseudocode. (Pour référence:
M
est le constructeur de type,feed
est l'opération "bind" etwrap
est l'opération "return".)la source