2017-06-12 4 views
0

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!

+0

Est-ce que 'Just <$> rename rule' fonctionne? – Ryan

+0

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

+2

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'. –

Répondre

5

Vous pouvez utiliser Just <$> renames rule, où l'opération <$> est fmap.