L'expression de calcul est-elle la même que la monade?

22

J'apprends toujours la programmation fonctionnelle (avec f #) et j'ai récemment commencé à lire sur les expressions de calcul. Je ne comprends toujours pas complètement le concept et une chose qui me rend incertain lors de la lecture de tous les articles concernant les monades (la plupart d'entre eux sont écrits sur la base de Haskell) est la relation entre les expressions de calcul et les monades.

Après avoir écrit tout cela, voici ma question (deux questions en fait):

Chaque expression de calcul F # est-elle une monade? Chaque monade peut-elle être exprimée avec une expression de calcul F #?

J'ai lu ce post de Tomas Petricek et si je le comprends bien, il déclare que les expressions de calcul sont plus que des monades, mais je ne suis pas sûr si j'interprète correctement.

Grzegorz Sławecki
la source
@Raphael puis-je demander quelle est la raison de la suppression de la balise lang?
Grzegorz Sławecki
2
Puisque nous nous soucions des concepts, nous essayons de garder la plupart des choses indépendantes du langage ici. Je ne sais pas ce que la suppression de F # fait à la question ( je pense que s'il est important que ce soit F # alors la question est hors sujet ici, mais c'est un cas limite) donc je ne supprime que la balise F #. Règle générale: F # n'est pas un concept CS, il n'a donc pas besoin de tag. (Oui, je connais d'autres balises PL et je ne les aime pas non plus. Pour certaines questions, la communauté a décidé qu'elles justifiaient ces balises.)
Raphael
1
@Raphael Je pense que la question est en effet un cas limite. Quelqu'un a décidé de le migrer ici, mais il semble que ce soit légèrement hors sujet ici également. La question elle-même est une sorte d'ordinateur depuis, mais en même temps les réponses et la question sont spécifiquement liées à f #. Je comprends votre règle d'or, merci pour les éclaircissements.
Grzegorz Sławecki

Réponses:

22

Tout d'abord, les expressions de calcul sont une caractéristique du langage, tandis que les monades sont des abstractions mathématiques, donc de ce point de vue, ce sont des choses complètement différentes .

Mais ce ne serait pas une réponse très utile :-). Les expressions de calcul sont une fonctionnalité de langage qui vous donne une syntaxe qui peut être utilisée pour la programmation avec des calculs (ou types de données) qui ont la structure monadique, mais ils peuvent également être utilisés avec d'autres structures. Vous pouvez lire mon article de zoo sur l'expression de calcul F # pour plus de détails, mais les expressions de calcul peuvent être utilisées avec:

  • Monades, mais aussi monades additives (ce que les Haskellers appellent MonadPlusou MonadOr)
  • Calculs composés (ce que les Haskellers appellent les transformateurs monades)
  • Calculs monadiques, mais prenant en charge d'autres constructions F # comme la gestion des exceptions
  • Monoïdes (et quelques variantes sans liaison monadique)
  • Foncteurs applicatifs (bien que cela ne soit implémenté que dans une extension de recherche)

Ainsi, les expressions de calcul sont certainement étroitement liées aux monades, mais elles ne leur sont pas si étroitement liées. Cela contraste, par exemple, avec la donotation de Haskell , qui est beaucoup plus étroitement liée aux monades (même si cela peut être utilisé avec des calculs qui ne sont pas strictement des monades mathématiques).

Tomas Petricek
la source
3
Les transformateurs de monade sont un moyen générique de convertir une monade en une autre monade - les expressions de calcul F # ne prennent réellement en charge que l'implémentation directe du / résultat / de cette transformation, plutôt que la transformation elle-même.
GS - Présentez vos excuses à Monica
1
@GaneshSittampalam - Oui, vous avez raison. Ma tentative de simplification n'a pas été très utile ici :-). Les expressions de calcul peuvent vous donner une syntaxe pour travailler avec un calcul résultant de l'application d'un transformateur de monade (avec une syntaxe potentiellement différente pour la monade sous-jacente et pour la monade composée)
Tomas Petricek
5

Vous pouvez utiliser des expressions de calcul pour exprimer des monades. Il y a un exemple ici . En outre, comme vous l'avez noté, vous pouvez utiliser des expressions de calcul pour bien plus que des monades. Il y a une explication détaillée sur la façon dont ils sont différents ici . Il n'y a pas d'espace ici pour expliquer la différence correctement, mais les expressions de calcul sont différentes des monades en ce qu'elles réutilisent la syntaxe F # normale et ont la possibilité d'ajouter des abstractions supplémentaires. Une limitation est qu'il est non idiomatique (et difficile) d'écrire une expression de calcul qui est polymorphe sur le type de calcul.

N / A
la source
1
Veuillez rendre votre réponse plus autonome en résumant au moins le contenu des pages auxquelles vous accédez. Votre réponse actuelle n'aura aucun sens si les deux liens cessent de fonctionner.
David Richerby
2
Je ne sais pas de quoi vous parlez. J'ai répondu explicitement aux questions et ai ensuite donné des liens vers plus d'informations si le demandeur est intéressé. Les liens ne sont pas nécessaires pour répondre à la question.
N_A
1
Je ne peux même pas imaginer que les deux liens pourraient cesser de fonctionner :-)
Tomas Petricek