Bonjour,

Il me semble que seules les valeurs fonctionnelles sont autorisées à droite d'un let-rec.
La seule exception est un constructeur de type

Effectivement, le "::" n'est pas un véritable opérateur, mais bien un constructeur de type.

Prenons le type : 

type 'a t = Empty | List of  'a * 'a t

Si on fait : 

let cyclique n = let rec liste = List (1, liste) in liste;;

ça passe parce que List est bien un constructeur de type. Or dans : 

let cyclique n = let rec liste = (repète n) @ liste in liste;;

l'opérateur @ n'est pas un constructeur, mais bien un appel de fonction qui lie le nom liste à l'appel et c'est précisément ce que le compilateur ne veut pas. Parce qu'il veut que la construction d'une valeur récursif qui n'est ppas une fonction soit statique.

Tu as le détail dans le manuel d'Ocaml : http://caml.inria.fr/pub/docs/manual-ocaml/extn.html#s%3aletrecvalues

Cordialement,



Le 7 septembre 2014 10:31, Jean-Denis Eiden <jean-denis.eiden@orange.fr> a écrit :
Bonjour à tous,

CaML light permet la construction suivante :

#let rec liste = 0::1::2::3::liste;;
liste : int list =
[0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0;
 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1;
 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2;
 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2; 3; 0; 1; 2;
 ...]

Cela étant, j'aimerais pouvoir faire la même chose en paramétrant la période ; par exemple, j'aimerais créer [ 0 ; 1 ; 2 ; ... ; n-1 ; 0 ; 1 ; 2 ; ... ] :

#let repète n = let aux = ref [] in for i = n-1 downto 0 do aux:= i::(!aux) done; !aux;;
repète : int -> int list = <fun>

#let cyclique n = let aux = repète n in let rec liste = aux @ liste in liste;;

Mais là :

let cyclique n = let rec liste = (repète n) @ liste in liste;;
                                          ^^^^^^^
Ce genre d'expressions n'est pas autorisé comme membre droit d'un "let rec".

Est-ce seulement un problème de syntaxe ou bien y a-t-il impossibilité absolue, la taille de la liste servant de période devant être connue à la compilation ?

Cordialement, Jean-Denis Eiden


--
Caml-list mailing list.  Subscription management and archives:
https://sympa.inria.fr/sympa/arc/caml-list
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs



--
Rémy El Sibaïe
Equipe APR, LIP6/IRILL, Université Pierre et Marie Curie