2010-11-27 29 views
1

J'essaie de créer des permutations de chaînes contenues dans une liste dans OCaml. J'ai travaillé sur l'extrait de code suivant jusqu'à maintenant mais je suis confronté à un problème en passant la première chaîne de la liste à ma méthode.Erreur - Appels de fonction récursifs en passant des listes - OCaml

Logique pour le code: Itérer pour chaque élément d'une liste et ajouter chaque élément à l'élément de la liste. Continuez jusqu'à ce que tous les éléments aient été ajoutés à la liste dans toutes les positions possibles.

code:

(* this function appends each string to each word in the list example: "A" with "ABC" *) 
let appendtocode n word = 
    let f x = n^x in 
    f word  
;; 

(* this function extracts every element of the list and appends it with the string. 
Example: "A" with ["AAA","ABC","ACD"] etc.. *) 
let appendtolist n list = 
    let f x = 
     if (List.length list) > 0 then list 
     else ((appendtocode n (List.hd list))^(appendtolist n (List.tl list))) 
    in 
    List.map f list 
;; 

Erreur:

Je reçois cette erreur:

valeur Unbound appendtolist

se produit à l'appel à: (n appendtolist liste List.tl)

Ma liste est seulement constitué de chaîne. Je travaille toujours sur le code. Mais bloqué à cause de cette erreur.

S'il vous plaît aider !!! Toute contribution serait géniale.

+0

Pourquoi est-ce marqué sml et smlnj si vous utilisez ocaml? – sepp2k

+1

J'ai corrigé les tags, car c'est définitivement OCaml et il n'y a pas de connexion évidente avec SML. – Porculus

+0

merci. et je m'excuse pour la confusion. – JJunior

Répondre

2

Pour appeler la fonction récursive, vous devez définir avec let rec appendtolist plutôt que let appendtolist.

Vous obtenez alors une autre erreur, parce qu'il ya d'autres bugs dans votre code ...

0

Je ne connais pas bien la SML, mais je pense que vous avez besoin de plus de parens, par ex.

else ((append-to-code n List.hd list)^(append-to-list n List.tl list)) 

devrait être

else ((append-to-code n (List.hd list))^(append-to-list n (List.tl list))) 
+0

J'ai essayé ceci. Terminer avec la même erreur :( – JJunior

+0

a changé le code et l'erreur mise à jour! – JJunior

+0

C'était en effet nécessaire, il ne produisait pas le message d'erreur que vous receviez, mais il aurait causé une erreur à l'étape suivante de typochecking. – Porculus

1

Vous obtenez l'erreur « valeur non liée appendtolist » parce que vous appelez appendtolist récursive sans déclarer comme récursive.

Vous devez écrire let rec appendtolist n list = ... pour pouvoir faire référence récursivement à appendtolist dans sa définition.