Bonjour,
dans quelques programmes simples en caml j'aimerais pouvoir arrêter une boucle 'for' dès qu'une condition est atteinte:
Par exemple:
let verifier_permute t =
let s = ref 0 in
for i = 0 to vect_length t - 2 do
if t.(i) > t.(i+1) then s := !s + 1;
done;
if !s = 0 then true else false;;
Je pense que c'est un peu inutile de faire intervenir le compteur s. En fait, il faudrait simplement que la boucle s'arrête dès que la condition est atteinte.
Si elle s'arrête, on renvoie false, sinon on renvoie true.
Mais je ne sais pas comment faire cela.
Merci d'avance
Quand j'ai regarder caml rapidement en 2005, les conditions d'arret complexe etait souvent gere par une exception. Les camleux du forum auront certainement un avis plus eclaire que le mien.
Je n'ai pas fais beaucoup de Caml mais comme l'a dis Godrik, il faut générer une exception qui permettra en quelque sorte de breaké la boucle. Ca peut paraître très artisanale mais il me semble que c'est uniquement comme cela que l'on procède.
Un extrait d'article expliquant plus en détail avec un exemple qui ressemble très fortement à ton problème. (Lien en bas de page)
La sortie prématurée des boucles
À l'aide du mécanisme d'exception, on implémente facilement la sortie prématurée des boucles for et while (l'équivalent de l'instruction break de C, ou exit du langage Ada). Pour cela, on déclenche l'exception prédéfinie Exit dans le corps de la boucle, et l'on pose un surveillant d'exception à l'extérieur de la boucle.
Par exemple, nous définissons une fonction qui teste si un vecteur donné contient un élément nul: si on rencontre un 0 dans le vecteur, on sort instantanément de la boucle de parcours et l'on rend la valeur vrai, sinon la boucle se déroule jusqu'au bout, et l'on retourne faux.
let contient_un_zéro v =
try
for i = 0 to vect_length v - 1 do
if v.(i) = 0 then raise Exit;
done;
false
with Exit -> true;;
La définition d'exceptions
L'utilisateur définit ses propres exceptions avec la construction exception nom;; pour une exception constante, ou exception nom of typ;; pour une exception avec argument. Ces exceptions sont génératives, c'est-à-dire que deux définitions successives d'une exception de même nom, créent deux exceptions différentes qui ne sont pas confondues par les programmes.
Typage: une exception constante a le type exn, une exception définie par exception nom of typ;; a le type typ -> exn.
Les exceptions prédéfinies
Un certain nombre d'exception sont prédéfinies pour signaler des problèmes ou erreurs courantes:
Failure of string: signale une erreur dans la fonction (ou pour la cause) indiquée.
Not_found: signale qu'une fonction de recherche a échoué (par exemple assoc).
Exit: utilisée pour sortir prématurément des boucles ou des fonctions.
Break: interruption des calculs (généralement par une intervention de l'utilisateur du programme).
Invalid_argument of string: l'argument passé à la fonction indiquée ne peut pas être traité.
Sys_error of string: erreur du système d'exploitation hôte de Caml (cette exception est définie dans le module sys).
Match_failure of string * int * int: signale un échec du filtrage dans le fichier indiqué à l'endroit indiqué.
End_of_file: signale une fin de fichier (cette exception est définie dans le module io).
http://caml.inria.fr/pub/old_caml_site/FAQ/controle_de_base-fra.html#break
up
Et tu up parceque ....
C’est tellement vieux comme un sujet mais je trouve ça relou d’utiliser une boucle for dans Caml