2017-06-20 2 views
1

J'essaye d'écrire une fonction dans SML qui recherche une liste de tuples pour une chaîne et si elle trouve la chaîne dans le premier élément du tuple, elle renvoie la seconde.Standard ML: Recherche d'une liste de tuples

fun getFromBlist (name : command, (x,y)::tail : (command*command) list) = 
    if x = name then y else getFromBlist(name, tail) 
    | getFromBlist(name, []) = ***** WHAT GOES HERE?!? ***** 

Y a-t-il quelque chose que je puisse utiliser pour le cas de base qui ne retournera rien? Tout ce que j'essaie, j'ai une erreur. Je suis ouvert à d'autres suggestions ici aussi, merci.

Répondre

3

Vous pouvez utiliser la structure Option pour revenir NONE pour le cas de base, J'ai légèrement reformaté le code, mettre le cas de base en premier lieu,

ainsi que le retour SOME y pour un match, et aucun pour le cas de base. De là, vous pouvez utiliser une instruction case ou une correspondance de modèle pour récupérer le résultat.

type command = string; 

fun getFromBlist(name, []) = NONE 
    | getFromBlist (name : command, (x,y)::tail : (command*command) list) = 
    if x = name 
     then SOME y 
     else getFromBlist(name, tail); 

Sinon, en fonction de ce que vous voulez, pour le cas de base, vous pouvez retourner la chaîne vide « », et y revenir comme vous l'avez fait à l'origine. Cela dépend de si la chaîne vide est une commande valide, et vous voulez faire la différence entre cela et le cas de base.

Mais pour résumer le scénario de base, et le résultat de alors doit retourner le même type, que ce soit chaîne, ou l'option