Supposons que nous souhaitons utiliser ReaderT [(a,b)]
sur la monade Maybe
, puis nous souhaitons effectuer une recherche dans la liste.Est-ce que les fonctions d'enveloppement dans un transformateur monad doivent être considérées comme une mauvaise pratique?
Maintenant facile, et pas trop moyen rare de c'est:
première possibilité
find a = ReaderT (lookup a)
Cependant, il ne semble que ce affirme quelque chose non négligeable sur le fonctionnement du transformateur READER . En regardant le code source de Control.Monad.Reader, il est clair que cela fonctionne très bien. Mais je n'ai lu aucune documentation à l'appui. Cependant, nous aurions pu écrire trouver comme ceci:
seconde possibilité
find a = do y <- ask
lift (lookup a y)
idées similaires tiennent pour envelopper MaybeT
, StateT
, State
et Reader
. Habituellement, j'écris quelque chose comme le premier exemple, mais la plupart du temps, il est vraiment évident de l'écrire comme le deuxième exemple, et vous pourriez même dire que c'est plus lisible. Donc ma question est la suivante: est-ce que le code comme le premier exemple devrait être considéré comme mauvais?
Vous pouvez également écrire '= trouver un ascenseur. recherche a = << ask', qui est aussi clair (IMHO) que la deuxième option, mais est plus courte. –
ou utilisez fmap: find a = fmap (recherche a) ask = recherche <$> ask – urso
Il est merdique qu'ils aient arrêté d'exporter le constructeur – fuz