2 votes

Convertisseur de l'état Haskell avec échec personnalisé

Je veux un monade State où fail modifie l'état plutôt que de déclencher une exception. L'échec en début d'une telle action devrait également sauter toutes les actions ultérieures.

Par exemple, ce qui suit devrait produire "FAILED: foo" comme état final :

execState (fail "foo") ""

ceci devrait produire le même résultat

execState (fail "foo" >> put "hi") ""

En utilisant la monade State standard, la première déclenche une exception et la deuxième produit "hi"

Je suppose qu'il y a une manière astucieuse d'utiliser StateT pour créer ma propre monade avec ce comportement, mais je ne l'ai pas encore découvert. Quelle est une bonne manière d'accomplir ceci ?

5voto

ivanm Points 3108

Vous pouvez essayer d'utiliser StateT appliqué à ErrorT (bien que vous puissiez avoir besoin de la variante stricte de StateT pour obtenir le comportement souhaité). Ici, l'appel à fail est transmis à la monade suivante.

Cependant, si vous voulez réellement l'inclure dans l'état interne plutôt que dans la pile, écrire votre propre monade de type State est probablement la meilleure option, en utilisant Either en interne. Par exemple, voyez comment polyparse a un parseur étatique avec un type de données interne qui enregistre si une erreur s'est produite ou non.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X