From: Diego Olivier Fernandez Pons <Diego-Olivier.FERNANDEZ-PONS@cicrp.jussieu.fr>
To: Alain Frisch <frisch@clipper.ens.fr>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Streams
Date: Sat, 3 Aug 2002 16:19:16 +0200 (DST) [thread overview]
Message-ID: <Pine.A32.3.95.1020803151507.29430A-100000@ibm1.cicrp.jussieu.fr> (raw)
In-Reply-To: <Pine.SOL.4.44.0208021706020.17897-100000@clipper.ens.fr>
Alain,
> type
> 'a stream =
> | Nil
> | Patchable of 'a stream_patchable
> and 'a stream_patchable = { mutable data : 'a streamCell }
> and
> 'a streamCell =
> | Cons of 'a * 'a stream
> | Append of 'a stream * 'a stream
> | Delayed of (unit -> 'a stream)
> | Generator of int * (int -> int) * (int -> 'a)
Mes listes à évaluation retardées contrairement à celles de Rauglaudre
supportent (quasi) totalement les fonctions génératrices, en
particulier leur concaténation.
Quand Generator ou Delayed vont envoyer une exception [Empty] ou une
liste vide [Nil] respectivement, il faut que je mémorise la valeur, ce
qui empêche la construction que vous proposez à moins d'utiliser
Append (Nil, Nil) ou un nouveau constructeur NilBis dans StreamCell.
voici ma fonction force
let rec force = function stream ->
(match stream.data with
| Delayed f -> let x = f () in stream.data <- x.data
| Generator (index, succ, gen) ->
(try
let next_index = succ index in
stream.data <- Cons (gen next_index,
makeStream (Generator (next_index, succ, gen)))
with Empty -> stream.data <- Nil)
etc.
) ;
stream
En fait nous voudrions mimer le mieux possible le comportement des
listes de base, avec une unique représentation de la liste vide :
# []
- : 'a list = []
# let (_ :: tail) = [1] in tail
- : int list = []
# { data = Nil }
- : '_a stream = { data = Nil }
> Couln't you just abstract the generator outside the stream ?
>
> let gen ini f =
> let state = ref ini in
> (fun () -> state := f !state),
> (fun () -> !state);;
>
> Do you really need to keep the current state visible ?
Cette représentation des générateurs a été choisie afin de pouvoir
implémenter (relativement) efficacement les fonctions take et drop.
J'ai gardé l'indexe courant visible car c'était fait ainsi dans
l'implémentation de Rauglaudre, en effet dans les streams de Caml
l'indexe compte simultanément le nombre d'états consommés :
la fonction drop k applique simplement succ^k sur l'indexe,
la fonction take k remplace succ par la version suivante
let count = ref k in
let succ' = function index ->
if !count = 0 then raise Empty
else decr count ; succ index
L'idée est essentiellement que décaler d'un indice est plus rapide que
générer une valeur avec evenutellement une fonction triviale si ce
n'est pas le cas 'a * 'a -> 'a * 'a -> 'a
Diego Olivier
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
next prev parent reply other threads:[~2002-08-03 14:22 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-07-03 2:49 [Caml-list] generic programming Oleg
2002-07-03 8:37 ` [Caml-list] " Ketanu
2002-07-03 17:29 ` Chris Hecker
2002-07-03 20:07 ` Oleg
2002-07-03 20:34 ` Alessandro Baretta
2002-07-04 15:33 ` John Max Skaller
[not found] ` <3D249B27.5080807@baretta.com>
[not found] ` <3D25D27B.2020005@ozemail.com.au>
2002-07-07 20:42 ` Alessandro Baretta
2002-07-08 0:59 ` John Max Skaller
2002-07-08 7:29 ` Alessandro Baretta
2002-10-15 0:10 ` Eray Ozkural
2002-07-03 21:55 ` Peter Wood
2002-07-04 2:02 ` james woodyatt
2002-07-04 15:18 ` John Max Skaller
2002-07-05 8:42 ` Francois Pottier
2002-07-05 9:25 ` Xavier Leroy
2002-07-05 9:57 ` Chris Hecker
2002-07-05 13:54 ` Xavier Leroy
2002-07-05 17:59 ` Chris Hecker
2002-07-05 20:31 ` John Max Skaller
2002-07-05 19:33 ` John Max Skaller
2002-07-05 19:31 ` John Max Skaller
2002-07-05 8:33 ` Francois Pottier
2002-07-05 23:05 ` Dave Berry
2002-07-08 9:54 ` Francois Pottier
2002-07-08 15:49 ` John Max Skaller
2002-08-02 14:49 ` [Caml-list] Streams Diego Olivier Fernandez Pons
2002-08-02 15:29 ` Alain Frisch
2002-08-03 14:19 ` Diego Olivier Fernandez Pons [this message]
2002-07-03 8:42 ` [Caml-list] generic programming Johan Baltié
[not found] ` <002301c22270$fb4ca160$2be213c3@youngkouzdra>
[not found] ` <20020703092753.M39371@wanadoo.fr>
2002-07-05 10:38 ` Anton Moscal
2002-07-03 9:10 ` Jun P.FURUSE
-- strict thread matches above, loose matches on Subject: below --
2006-08-10 10:51 Streams Error404
2006-08-10 11:40 ` [Caml-list] Streams Jonathan Roewen
2006-08-10 19:02 ` Chris King
2006-08-10 18:32 ` Martin Jambon
2006-08-11 0:00 ` Jon Harrop
[not found] <F241eHu7RVLCMUWktUq0000fbc1@hotmail.com>
2002-04-09 18:09 ` [Caml-list] Cannot find Stream Parser Documentation Wolfram Kahl
2002-04-10 11:03 ` [Caml-list] Streams Daniel de Rauglaudre
2002-04-11 14:35 ` Wolfram Kahl
2001-03-27 2:12 [Caml-list] Caml Development Kit Patrick M Doane
2001-03-27 3:15 ` Brian Rogoff
2001-03-27 6:48 ` [Caml-list] Streams Daniel de Rauglaudre
[not found] ` <3AC04E85.EE51D597@univ-savoie.fr>
2001-03-27 8:37 ` Daniel de Rauglaudre
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=Pine.A32.3.95.1020803151507.29430A-100000@ibm1.cicrp.jussieu.fr \
--to=diego-olivier.fernandez-pons@cicrp.jussieu.fr \
--cc=caml-list@inria.fr \
--cc=frisch@clipper.ens.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