2010-11-30 34 views
6

J'écris un programme dans ocaml contenant des boucles "for", mon problème est que pour chacun de ces cycles, vous recevez ce message: "warning 10: cette expression doit avoir un type unité. "warning 10: cette expression devrait avoir l'unité de type

Exemple:

let f q p rho= 

     let x = [] in 
     if q > p then 
      for i=0 to rho do 
       x= q :: x 
      done;  
    x;; 

chaque fois que j'utilise un cycle "pour", comment puis-je résoudre ce problème?

Répondre

8

Votre code présente plusieurs problèmes.

L'erreur est que le for ne renvoie rien, et donc l'intérieur de la boucle est purement pour les effets secondaires. Donc, il devrait avoir le type d'unité. Votre utilisation de = n'a pas de type d'unité, car = est en fait l'opérateur d'égalité, compare deux valeurs et renvoie true ou false.

Vous utilisez donc le mauvais opérateur. Il semble que vous essayez d'attribuer à x. Mais dans ML, vous ne pouvez pas affecter des "variables", car elles sont liées à une valeur lorsqu'elles sont définies et ne peuvent pas changer. Une façon d'obtenir la mutabilité consiste à utiliser une cellule mutable (appelée "référence"): vous utilisez la fonction ref pour créer la cellule mutable à partir d'une valeur initiale; l'opérateur ! pour obtenir sa valeur; et l'opérateur := pour changer la valeur à l'intérieur.

Ainsi, par exemple:

let f q p rho= 

    let x = ref [] in 
    if q > p then 
     for i=0 to rho do 
      x := q :: !x 
     done;  
    !x;; 
+0

merci pour votre répondre, thong votre exemple en ajoutant "!" : x: = q ::! x – kafka

+0

@Antonio: merci – newacct

3

Ce type de boucle est probablement mieux exprimée à l'aide récursion:

let f q p rho= 
    let rec loop i = 
    if i > rho then 
     [] 
    else 
     q::(loop (i+1)) 
    in 
    if q > p then 
     loop 0 
    else 
     [];; 

Ou nous pouvons le faire la queue récursives:

let f q p rho= 
    let rec loop i acc = 
    if i > rho then 
     acc 
    else 
     loop (i+1) (q::acc) 
    in 
    if q > p then 
     loop 0 [] 
    else 
     [];;