Décrochez un haskell présente le sont les types de J'ai essayé de le mettre en œuvre en utilisant donnez-moi un indice pour le compléter, ainsi que Modifiez ma compréhension de la version de notation code> do code>. P> Si je comprends, le Fonction code> Fonction: < Pré> xxx pré> A code>, b code> et retour (A + B) code> Tous Int -> int code>? Je pense que, mais je ne sais pas comment lier code> joue un rôle. P> >> = code>, mais Je ne sais pas comment le compléter (par conséquent ... code>). P> ... code> doit inclure un type de int -> int code>. Dans la version do code>, je pourrais utiliser A code> et b code>, mais je ne sais pas comment les ajouter avec le >> = code> version. p> p>
3 Réponses :
comme une règle approximative si vous souhaitez désinvérer manuellement la notation de Do-Notation, effacez d'abord le faire code> en haut et retournez la flèche de connexion ( à gauche -Avez-le-côté à un (>> =) code> à droite avec la variable de gauche en tant que variable Lambda à droite. Donc: {-# LANGUAGE ScopedTypeVariables #-}
import Control.Monad.Instances
addStuff :: Int -> Int
addStuff = do
(a :: Int) <- (*2)
(b :: Int) <- (+10)
(return (a+b)) :: Int -> Int
Une note: la première règle de réécriture ne détient que dans le cas (certes fréquemment) lorsque A code> est un motif qui ne peut pas échouer. Sinon, la règle est un peu plus compliquée, voir Le rapport de langue a>
Lorsque vous travaillez avec le lecteur monade (A.k.a. la fonction monade), vous avez le type remarque que pendant lequel peut être réécrit comme p> ou même p> afin que vous puissiez voir, quel et donc et c'est le résultat serait p> Qu'est-ce que cela essentiellement est en train de prendre l'argument sur Alors, comment pouvez-vous écrire cela sans la notation? Vous pouvez faire quelque chose comme p> lequel, certes, n'est pas très lisible, même avec le formatage, mais le gist est fondamentalement que avec un peu de simplification, vous pouvez également faire chacun de ces lambdas imbriquées dans Deux arguments Lambdas: p> J'ai également remplacé le dernier a -> b code>, qui peut être réécrit comme (->) A B code>. L'instance de monad réelle ici est >> = code>, le type est p> >> = < / code> prend une seule entrée, s'applique qu'en f code>, puis appliquez ce résultat à g code> pour produire une nouvelle fonction r -> b code>. Donc, pour votre exemple, vous pouvez utiliser: p> towstFF '10 == 30 code>, car il effectue le calcul (10 * 2) + (10) code>. Remarque Comment 10 code> est alimenté à la fois sur (* 2) code> et (+) code> et le résultat de (10 * 2) < / code> est envoyé à (+) code> aussi. Cela pourrait rendre les choses un peu plus clairs pour le voir comme p> test code> "avant", il a été appliqué, l'alimentant à chacune des fonctions du côté droit du <- code> S, puis combinant Cela entraîne le retour code>. p>
r code> est alimenté pour Chaque fonction intermédiaire, qui produit un résultat et quelques expressions de Lambda imbriquées plus tard, vous retournerez plus tard les trois de ces résultats dans un tuple. P> \ z -> retour (x, y, z) code> avec son équivalent \ z -> const (x, y, z) code> => \ zr -> const (x, y, z) r code>, il suffit donc de tous avoir la même forme. < / p> p>
Merci à Bheklilr. J'ai écrit mon propre code.
addStuff :: Int -> Int
addStuff = (\r -> r * 2) >>= (\x ->
(\r -> r + 10) >>= (\y ->
return (x + y)))
Vous devriez rechercher l'application. Je ne peux pas vérifier si
(+) <$> (* 2) <*> (+10) code> est correct, mais je suis sûr quetwsttuff code> peut être écrit dans un style d'application.@Kevinmeredith: Le message suivant explique le désupération de
do code> de manière succincte Stackoverflow.com/a/16726740/ 917635 . Pourrait être utile.