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.
Cordialement,