2017-07-21 6 views
0

J'écris du code OCaml qui lit dans une liste et supprime tous les caractères qui apparaissent au début de la liste. Par exemple, la liste removeI['i';'i';'a';'c';'i'] doit renvoyer -: int * char list = ['a';'c';'i'], car il y a 2 'i au début de la liste. Je crois que je sais comment l'appliquer correctement; cependant, je veux retourner un tuple qui inclut le nombre de 'i' enlevés ainsi que la nouvelle liste avec les 'i retirés. Je sais que cela peut sembler déroutant, mais un exemple serait Il y a 2 'i enlevés et la nouvelle liste avec les' i 'enlevés.OCaml compte des éléments consécutifs dans une liste

Jusqu'à présent, j'ai la fonction suivante:

let rec removeI list = match list with 
| [] -> [] 
| x::[] -> x::[] 
| x::y::t1 -> if x='i' then removeI (y::t1) 
       else list;; 

Cette retourne la liste avec le premier « i est retiré, mais je continue à obtenir des erreurs lorsque je tente d'inclure le nombre de supprimé » i est dans le cadre de un tuple. Quelqu'un pourrait-il me pousser dans la bonne direction? Merci!

Répondre

0

Votre appel récursif renverra le même type que la fonction globale. Donc, si vous changez la fonction en reuturn (count, list), l'appel récursif le renverra également.

Généralement, vous souhaitez regrouper les valeurs renvoyées et en calculer une nouvelle valeur.

En ce moment, vous avez ceci:

removeI (y :: t1) 

Mais vous avez besoin quelque chose comme ceci:

let (count, list) = removeI (y :: t1) in 
(* Newly calculated count and list *) 

Notez que votre cas de base doivent également renvoyer un nombre et une liste.

En guise de commentaire, je ne comprends pas vraiment votre deuxième cas de base. Vous ne voulez pas supprimer un 'i' si c'est la seule chose dans la liste? Cela ne semble pas particulièrement cohérent.