Applicatifs composer, les monades ne sont pas
Applicatifs composer, les monades ne sont pas.
Que fait la déclaration ci-dessus signifie? Et quand est une préférables à d'autres?
D'où avez-vous obtenu cette déclaration? Il peut être utile de voir un certain contexte.
Je l'ai entendu à plusieurs reprises de nombreuses personnes différentes, récemment, de debasishg sur twitter.
tetley: Notez que beaucoup de ces
Tous ceux zippy applicatifs (qu'ils tronquent ou pad) se restreindre aux monades si vous corrigez la forme d'une manière qui équivaut à une
tetley: d'Autres exemples comprennent la constante-monoïde applicative (qui est une composition de monades, mais pas une monade), et l'unité de retard applicative (qui ferait mieux de ne pas admettre la rejoindre).
Je l'ai entendu à plusieurs reprises de nombreuses personnes différentes, récemment, de debasishg sur twitter.
tetley: Notez que beaucoup de ces
Applicative
s sont en fait un ensemble de famille de Monad
s, à savoir un pour chaque "forme" de la structure possible. ZipList
n'est pas un Monad
, mais ZipList
s d'une longueur fixe. Reader
est une pratique particulière (ou est-ce général?) cas où la taille de la "structure" est fixé comme la cardinalité de l'environnement type.Tous ceux zippy applicatifs (qu'ils tronquent ou pad) se restreindre aux monades si vous corrigez la forme d'une manière qui équivaut à une
Reader
monade jusqu'à isomorphisme. Une fois que vous avez corrigé la forme du récipient, elle code pour une fonction à partir de positions, comme un mémo trie. Peter Hancock appels tels foncteurs "Naperian", comme ils obéissent à des lois des logarithmes.tetley: d'Autres exemples comprennent la constante-monoïde applicative (qui est une composition de monades, mais pas une monade), et l'unité de retard applicative (qui ferait mieux de ne pas admettre la rejoindre).
OriginalL'auteur missingfaktor | 2011-08-12
Vous devez vous connecter pour publier un commentaire.
Si l'on compare les types de
nous obtenir un indice sur ce qui sépare les deux concepts. Que
(s -> m t)
dans le type de(>>=)
montre qu'une valeur danss
peut déterminer le comportement d'un calcul dansm t
. Les monades permettre l'interférence entre la valeur et les calculs. Le(<*>)
opérateur permet pas une telle ingérence: la fonction et argument calculs ne dépendent pas des valeurs. - Ce vraiment des morsures. Comparerqui utilise le résultat d'un effet de décider entre deux calculs (par exemple, le lancement de missiles et de la signature de l'armistice), alors que
qui utilise la valeur de
ab
de choisir entre les valeurs de les deux calculsat
etaf
, après avoir effectué les deux, peut-être pour effet tragique.La monadique version s'appuie essentiellement sur la puissance supplémentaire de
(>>=)
de choisir un calcul à partir d'une valeur, et qui peut être important. Toutefois, en soutenant que le pouvoir monades difficile de composer. Si nous essayons de construire des " double-bind’on en arrive là, mais maintenant nos couches sont tout mélangés. Nous avons une
n (m (n t))
, de sorte que nous devons nous débarrasser de l'extérieurn
. Alexandre C dit, nous pouvons le faire si nous avons adaptéde permuter l'
n
vers l'intérieur etjoin
à l'autren
.Les plus faibles de la " double-appliquer’ est beaucoup plus facile de définir
car il n'y a pas d'interférence entre les couches.
En conséquence, il est bon de reconnaître quand vous avez vraiment besoin de la puissance supplémentaire de
Monad
s, et quand vous pouvez vous en tirer avec la rigide calcul structureApplicative
prend en charge.Noter, en passant, que, bien que la composition des monades est difficile, il pourrait être plus que vous avez besoin. Le type
m (n v)
indique le calcul avecm
-effets, puis l'informatique avecn
les effetsv
-valeur, où lam
-effets terminer avant len
-effets commencent (d'où la nécessité pourswap
). Si vous voulez juste interleavem
-effets avecn
-effets, puis la composition est peut-être trop demander!Vous obtenez toujours le effets de deux, mais de pures (erreur "mauvais") n'en ont pas. Si, d'autre part, vous essayez douteux (le Vrai) (pur "bonjour") erreur ("mauvais"), vous obtenez un message d'erreur qui miffy évite. En outre, si vous essayez quelque chose comme douteux (le Vrai) (pur 0) [1,2], vous obtiendrez [0,0] au lieu de [0]. Applicatifs ont une sorte de rigueur sur eux, qu'ils se construisent fixe des séquences de calculs, mais le résultant de ces calculs sont combinées paresseusement, comme vous l'observez.
Est-il vrai, que pour toutes les monades
m
etn
vous pouvez toujours écrire une monade transformateurmt
, et l'exploitation desn (m t)
à l'aide demt n t
? De sorte que vous pouvez toujours composer des monades, il est un peu plus compliqué, en utilisant des transformateurs?Ces transformateurs, il existe souvent, mais autant que je sache, il n'y a pas de manière canonique de les générer. Il y a souvent un véritable choix sur la façon de résoudre entrelacés effets de différents monades, l'exemple classique étant des exceptions et de l'état. Si une exception restaurer les modifications de l'état ou pas? Les deux choix ont leur place. Cela dit, il y a un "libre monade" chose qui exprime "l'arbitraire de l'entrelacement".
data Free f x = Ret x | Do (f (Free f x))
, puisdata (:+:) f g x = Inl (f x) | Tnr (g x)
, et d'envisagerFree (m :+: n)
. Qui retarde le choix de la façon d'exécuter des entrelacements.Concernant le paresseux/stricte débat. Je pense qu'avec applicatifs vous ne pouvez pas contrôler l'effet de dans le calcul, mais le l'effet de la couche peut très bien décider de ne pas évaluer plus tard des valeurs. Pour (applicative) analyseurs cela signifie que si l'analyseur ne parvient pas au début, à la suite d'analyseurs ne sont pas évalués ou appliquée à l'entrée. Pour
Maybe
cela signifie qu'un débutNothing
supprimer l'évaluation de laa
de plus tard/ultérieursJust a
. Est-ce correct?OriginalL'auteur pigworker
Monades ne composer, mais le résultat pourrait ne pas être une monade.
En revanche, la composition de deux applicatifs est nécessairement un applicative.
Je crois que l'intention de l'original de la déclaration a été que "Applicativeness compose, tout en monadness ne fonctionne pas." Reformulé, "
Applicative
est fermé en vertu de la composition, etMonad
ne l'est pas."En outre monades composer dans d'autres façons, le produit de deux monades est une monade, c'est seulement les coproduits qui a besoin d'une sorte de loi de distributivité.
Avec, @Apocalisp, commentaires inclus, c'est la meilleure et la plus concise réponse.
OriginalL'auteur Conal
Si vous avez des applicatifs
A1
etA2
, puis le typedata A3 a = A3 (A1 (A2 a))
est également applicative (vous pouvez écrire une telle instance de manière générique).D'autre part, si vous avez des monades
M1
etM2
, puis le typedata M3 a = M3 (M1 (M2 a))
n'est pas nécessairement une monade (il n'est pas raisonnable générique de mise en œuvre de>>=
oujoin
pour la composition).Un exemple peut être le type
[Int -> a]
(ici, nous composer un constructeur de type[]
avec(->) Int
, qui sont tous deux monades). Vous pouvez facilement écrireEt qui généralise à toute applicative:
Mais il n'est pas raisonnable définition de
Si vous êtes pas convaincu de cela, envisager de cette expression:
La longueur de la liste retournée doit être fixé dans la pierre avant un entier est déjà fourni, mais la bonne longueur de celui-ci dépend du nombre entier qui est fourni. Ainsi, il n'y a pas
join
fonction peut exister pour ce type.si tu voulais parler de foncteur, alors oui, les foncteurs sont simples et doivent être utilisés lorsqu'il y a suffisamment. Notez qu'il n'est pas toujours le cas. Par exemple
IO
sansMonad
serait très difficile de programme. 🙂OriginalL'auteur Rotsor
La composition des monades http://web.cecs.pdx.edu/~mpj/pubs/RR-1004.pdf
swap : N M a -> M N a
C.: il suffit de "si", je soupçonne. Pas tous les monade transformateurs sont décrites en direct foncteur de la composition. Par exemple,
ContT r m a
est nim (Cont r a)
niCont r (m a)
, etStateT s m a
est à peu prèsReader s (m (Writer s a))
.A. McCann: je n'arrive pas à obtenir à partir de (M monade, N monade, MN monade, NM monade) (il existe swap : MN -> NM naturel). Donc, nous allons en tenir à "si" pour l'instant (peut-être la réponse est dans le livre, je dois avouer que j'ai regardé rapidement)
C.: il suffit de spécifier que les compositions sont des monades peut-être pas assez de toute façon-vous également besoin d'une certaine manière de lier les deux parties avec le tout. L'existence de
swap
implique que la composition permet de les deux "coopérer" en quelque sorte. Notez également quesequence
est un cas particulier de "swap" pour certains monades. Donc, estflip
, en fait.Pour écrire
swap :: N (M x) -> M (N x)
il me semble que vous pouvez utiliserreturns
(convenablementfmap
ped) pour insérer uneM
à l'avant et uneN
à l'arrière, passant deN (M x) -> M (N (M (N x)))
, puis utilisez lejoin
du composite pour obtenir votreM (N x)
.OriginalL'auteur Landei
La loi de distributivité de la solution
l : MN -> NM est assez
pour garantir monadicity de NM. Pour voir cela, vous avez besoin d'une unité et d'une mult. je vais me concentrer sur le mult (l'unité est unit_N unitM)
Cela ne pas garantir que MN est une monade.
L'observation cruciale cependant, entre en jeu lorsque vous avez distributive de la loi solutions
ainsi, LM, LN et MN sont des monades. La question se pose de savoir si LMN est une monade (soit par
(MN)L -> L(MN)
ou par
N(LM) -> (LM)N
Nous avons assez de structure à faire de ces cartes. Cependant, comme Eugenia Cheng observe, nous avons besoin d'un hexagonal condition (qui équivaut à une présentation de l'équation de Yang-Baxter), afin de garantir monadicity de la construction. En fait, avec la forme hexagonale de la condition, les deux monades coïncident.
C'est parce que, à l'aide de l'expression Applicative et haskell tag, c'est une question à propos de haskell, mais avec une réponse dans une autre notation.
OriginalL'auteur user278559