J'ai un algorithme qui fonctionne sur un IntMap que je pense que le mieux serait exprimé impérativement. C'est-à-dire, je voudrais dire des choses comme:Existe-t-il une instance de monad pour Data.Map/Data.IntMap?
- Recherchez la valeur X dans la carte.
- S'il correspond à un critère, supprimez cette valeur de la carte.
- Boucle jusqu'à ce qu'il n'y ait plus de valeurs dans la carte.
Ce serait assez trivial d'exprimer une récursion deux lignes, mais l'algorithme réel est un peu plus complexe, impliquant plusieurs suppressions et les recherches, donc je voudrais pouvoir exprimer en notation do
.
Y at-il une norme « État » -comme monade où l'Etat est représenté par Data.Map
ou Data.IntMap
, où je peux faire quelque chose comme:
do
insert 5 20
(ma, mv) <- lookup 4
case mv of
Just v -> delete (fromJust ma)
Nothing -> return()
Honnêtement, je ne suis pas sûr de savoir comment mieux exprimer cela. En raison de lookup
il semblerait bénéficier d'une sorte de MaybeT IntMap m
pile ou quelque chose.
J'ai fait un peu de travail à essayer de définir ma propre monade de l'Etat basé sur Data.IntMap
, même obtenu jusqu'à faire insert
et delete
travail, mais nous avons eu un peu coincé avec la façon de traiter lookup
. La plupart du temps je pense que c'est probablement quelque chose que quelqu'un a déjà résolu, mais je ne peux pas le trouver sur Hackage.
Wow. Je vous remercie. J'ai vraiment besoin de m'habituer à utiliser des transformateurs. Cet exemple est d'une grande aide pour montrer comment les utiliser pratiquement. Tous les didacticiels de la monade vous montrent comment en créer un à partir de rien, mais ils vous montrent rarement comment tirer parti de ce qui est déjà disponible. – Steve
@Steve Ce qui m'a aidé à comprendre les transformateurs monad est de les considérer comme une pile de monades ou d'oignons avec des calques et les champs d'enregistrement ou les fonctions d'exécution de chaque type de transformateur monad. –