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>