J'ai beaucoup de difficulté à comprendre le deuxième contrôler.monad.free code> implémente une monade gratuite comme:
aller code> ligne, surtout dans le contexte des descriptions de Qu'est-ce qu'une monade gratuite est . Can Somenoe s'il vous plaît décrire comment cela fonctionne et pourquoi il fait
Free Fa code> une monade gratuite? P> p>
3 Réponses :
À ce stade, vous faites simplement Je pense qu'il serait un peu plus facile de penser si nous renommerions le constructeur code> gratuit (code> pour éviter toute confusion: P> gratuit code> un foncteur plutôt qu'une monade. Bien sûr, être une monade, il doit s'agir également d'un foncteur!
data Free f a = Pure a | Wrap (f (Free f a))
Depuis que je suis confondu moi-même, je réponds avec une question ... Cela pourrait-il être une substitution correcte (s'appuyant sur la clarification globale de Tikhon)?
Une monade gratuite est 0 code> ou plus
wrap code> s se terminant dans un
pure code>.
FMAP F CODE> Applique la fonction
f code> à la valeur stockée dans la finale
pure code>.
@Gabrielgonzalez Merci, c'est une explication très concise et claire. Puis-je vous demander si la substitution que j'ai écrite a du sens?
Ouais, sauf pour une faute de frappe. Il devrait être enveloppement (F (pur (ga))) code> au lieu de
wrap (F (pure g a)) code>. Autre que cela vous avez raison.
Bonjour Groovy, comment avez-vous eu de wrap (fmap (fmap g) (fmap g) (F F (Free FA))) Code> à
Wrap (F (FMAP G (Free FA))) Code> ?
Bonjour Groovy, comment avez-vous eu de wrap (fmap (fmap g) (fmap g) (F F (Free FA))) Code> à
Wrap (F (FMAP G (Free FA))) Code> ?
@ Me2 pense au type de fmap - donné une fonction (a -> b) code> et un foncteur
fa code>, fmap applique la fonction à
A code >, entraînant
fb code>. Une étape avant
f b code> pourrait être écrit comme
f ((a -> b) a) code>. Depuis à l'intérieur de l'enveloppe, nous avons une expression qui ressemble à
fmap (une fonction) (FA) code>, nous pouvons déplacer la fonction à l'intérieur du fonctionnement pour obtenir
wrap (f ((fmap g) )) code>. Notre
A code> dans ce cas est
(Free Fa) code> et la fonction est
(fmap g) code>. En raison de la nature de la FMAP, nous pouvons éliminer ces parenthèses intérieures pour obtenir
wrap (fmap ga)) code>, où
a code> est
(Free fa) code>. Cela a-t-il du sens?
Pour vous dire la vérité, je trouve généralement que cela ne trouve généralement pas pas em> pour lire le code dans ces fonctions simples, mais plutôt pour lire les em> types em> puis écrivez la fonction moi même. Pensez-y comme un casse-tête. Vous essayez de construire ceci: alors comment le faisons-nous? Eh bien, prenons le constructeur avec les deux commentaires de type et connaissant le type de maintenant le deuxième cas: p> Eh bien, puisque f code> est un document code>, nous pouvons réellement utiliser maintenant, à l'aide de cette définition comme référence pure code> d'abord: p>
pur code>, vous devriez voir la solution immédiatement: p>
mapfree code> pour appliquer
mapfree f code> sur le composant interne de
f (FA) Code>. Nous obtenons donc: p>
Foncteur F => Foncteur (Free f) code> instance, nous obtenons: P >
instance Functor f => Functor (Free f) where
fmap f (Pure a) = Pure (f a)
fmap f (Free fa) = Free (fmap (fmap f) fa)
<$> == fmap code>, peut-être que cela le rend plus clair. Ceci est plus ou moins la seule mise en œuvre possible.
@Niklasb. peut
<$> code> être utilisé à la fois préfixe et infixe?
@groovy: Ouais, comme n'importe quelle fonction:
(+ 1) <$> [1,2,3] == (<$>) (+1) [1,2,3] == fmap (+ 1) [1,2,3] == (+1) `fmap` [1,2,3] code>