From: "Rémy Besognet" <remy.el-sibaie@lip6.fr>
To: Jean-Denis Eiden <jean-denis.eiden@orange.fr>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] listes qui bouclent
Date: Sun, 7 Sep 2014 10:55:29 +0100 [thread overview]
Message-ID: <CAKAHPK2S5zaYGZzVzaRE6tKsywBXxNzMzE4Sf59385dh95kwdg@mail.gmail.com> (raw)
In-Reply-To: <91F16B653D20446DA42F7B673FD5509D@PCdejd>
[-- Attachment #1: Type: text/plain, Size: 2664 bytes --]
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ïeEquipe APR, LIP6/IRILL, Université Pierre et Marie Curie*
[-- Attachment #2: Type: text/html, Size: 4931 bytes --]
next prev parent reply other threads:[~2014-09-07 9:55 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-07 9:31 Jean-Denis Eiden
2014-09-07 9:55 ` Rémy Besognet [this message]
2014-09-07 13:24 ` Jeremy Yallop
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAKAHPK2S5zaYGZzVzaRE6tKsywBXxNzMzE4Sf59385dh95kwdg@mail.gmail.com \
--to=remy.el-sibaie@lip6.fr \
--cc=caml-list@inria.fr \
--cc=jean-denis.eiden@orange.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox