caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
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 --]

  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;
as well as URLs for NNTP newsgroup(s).