J'ai une fonction Haskell dans ma mission d'interprète Prolog qui litrésultat Wrap Etat dans un Juste
renames :: Rule -> State ExecState [(Term, Term)]
qui produit (presque) une substitution de variables dans une règle Prolog (de sorte que les noms de variables ne se heurtent pas pendant l'unification).
Les paires produites par cette fonction sont de la forme (Variable "X", Variable "X_11")
, ce qui signifie que doit être renommé la variable X -X_11, etc. (le compteur pour les renomme est contenu dans ExecState
).
Le problème est que je l'ai défini une substitution à être
type Subst = Maybe [(Term, Term)]
et qui fait sens, parce que parfois une substitution ne peut être trouvée qui unifie deux termes. (Mais la substitution de renommer les variables est toujours trouvée.)
J'ai essayé
renames' :: Rule -> State ExecState Subst
renames' rule = Just $ renames rule
mais ça ne marchera pas, évidemment, parce que j'Enroulez le State
dans le Just
, pas le résultat du calcul.
Comment est-ce que j'emballe le résultat réel [(Term, Term)]
dans le Just
? Et y a-t-il un nom à ce que j'essaie de faire?
Merci!
Est-ce que 'Just <$> rename rule' fonctionne? – Ryan
Eh bien, c'est le cas :). Comment ai-je pu manquer '<$>'? Merci, @Ryan! Si vous avez la difficulté d'afficher cela comme réponse, je serai heureux de l'accepter. – David
Vous pouvez changer la définition de 'Subst' en' type Subst = [(Term, Term)] ', puis utiliser' Maybe Subst' sur les opérations qui peuvent échouer à produire une substitution, maintenant que vous avez découvert un cas où 'Subst' n'a pas besoin du wrapper' Maybe'. –