2012-02-12 3 views
2

J'ai un tuple (int * string) que je veux convertir en liste. Le tuple est de la forme (N, E) où N est le nombre d'occurrences de l'élément E. La fonction devrait retourner une liste avec N occurrences de E dans celle-ci. L'exemple est ci-dessous. Supposons que cette fonction s'appelle tuple_decode.Fonction Ocaml pour convertir un tuple en une liste

tuple_decode (1, "A") -> ["A"] 
tuple_decode (2,"B") -> ["B";"B"] 
tuple_decode (4,"C") - > ["C";"C";"C";"C"] 

La fonction tuple_decode est la suivante

let tuple_decode acc (n,elem) = 
let add_one_elem i = 
    match i with 
      0 -> acc 
     | i -> elem :: acc ; add_one_elem (i-1) (* Line 184 *) 
in 
add_one_elem n 
;; 

lorsque je tente de compiler cette fonction que je reçois l'erreur suivante.

File "all_code.ml", line 184, characters 11-22: 
Warning 10: this expression should have type unit. 
File "all_code.ml", line 184, characters 25-37: 
Error: Unbound value add_one_elem 

Quelqu'un pourrait-il m'aider à comprendre pourquoi j'obtiens cette erreur et ce message d'avertissement.

salutations Puneet

Répondre

6

L'avertissement provient de la composition de séquence en utilisant ;. Lorsque vous écrivez S1 ; S2, le compilateur s'attend à ce que S1 ait le type unit. Mais ici, S1 renvoie une liste (elem::acc) dont la valeur sera rejetée. De plus, puisque vous n'avez pas passé acc comme argument, sa valeur ne change pas après tous les appels récursifs.

L'erreur est due à l'utilisation récursive de add_one_elem. Parce que vous n'avez pas utilisé le mot clé rec, lorsque add_one_elem (i-1) est appelée, OCaml ne sait pas add_one_elem est défini de manière récursive.

De plus, acc doit être un paramètre de add_one_elem d'accumuler des résultats:

let tuple_decode (n, elem) = 
    let rec add_one_elem i acc = 
     match i with 
     | 0 -> acc 
     | i -> add_one_elem (i-1) (elem::acc) 
    in add_one_elem n [] 
+2

En outre, il est intéressant de noter que, pour la partie d'avertissement, si 'S1' n'a pas de type' unit' le résultat est jeté. Donc, si vous ne passez pas l'accumulateur en argument à votre fonction, l'appel récursif est inutile. – Thomas

+0

Merci, j'ai ajouté votre suggestion pour clarifier la réponse. – pad

Questions connexes