From: Brian Hurt <bhurt@spnz.org>
To: Keith Wansbrough <Keith.Wansbrough@cl.cam.ac.uk>
Cc: Luca Pascali <pasckosky2000@yahoo.it>, <caml-list@inria.fr>
Subject: Re: [Caml-list] Recursive lists
Date: Sun, 10 Oct 2004 19:44:25 -0500 (CDT) [thread overview]
Message-ID: <Pine.LNX.4.44.0410101928130.4934-100000@localhost.localdomain> (raw)
In-Reply-To: <E1CFuqr-0000uk-00@mta1.cl.cam.ac.uk>
Sorry for the late reply.
On Fri, 8 Oct 2004, Keith Wansbrough wrote:
>
> > Can some functions of the List library support the use of the recursive
> > lists?
> > I mean: can some scanning functions such as map, for_all, exists, mem,
> > filter, and so on understand if they are working on recursive lists and
> > act correctly without going in buffer overflow or infinite loops?
>
> How could they do this? It's just a list; there's nothing special
> about it, except that it has no end.
You can detect circular lists in O(N) thusly:
let is_circular lst =
let rec loop p1 p2 =
match p1, p2 with
| (a :: t1), (b :: c :: t2) ->
if (a == b) || (a == c) then
true
else
loop t1 t2
| _ -> false
in
match lst with
| _ :: t -> loop lst t
| [] -> false
;;
let circular_part lst =
let rec find_an_element p1 p2 =
(* find an element in the circular part of the list *)
match p1, p2 with
| (a :: t1), (b :: c :: t2) ->
if (a == b) || (a == b) then
p1
else
find_and_element t1 t2
| _ -> []
in
let find_circular_length lst =
(* find the number of elements in the circular part of the list *)
let rec loop c p =
if lst == p then
c
else
match p with
| _ :: t -> loop (c+1) t
| [] -> 0
in
match lst with
| _ :: t -> loop 1 t
| [] -> 0
in
let rec nth_tail cnt lst =
if cnt == 0 then
lst
else
nth_tail (cnt-1) (List.tl lst)
in
let rec find_loop p1 p2 =
if (p1 == p2) then
p1
else
find_loop (List.tl p1) (List.tl p2)
in
match lst with
| [] -> []
| _ :: t ->
match find_an_elem lst t with
| [] -> []
| cirelem ->
let cirlen = find_circular_length cirelem in
let p = nth_tail cirlen lst in
find_loop lst p
;;
Note: I haven't tested the above functions, but they give you the idea of
how to handle circular lists.
--
"Usenet is like a herd of performing elephants with diarrhea -- massive,
difficult to redirect, awe-inspiring, entertaining, and a source of
mind-boggling amounts of excrement when you least expect it."
- Gene Spafford
Brian
-------------------
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:[~2004-10-11 0:36 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-10-08 13:20 Luca Pascali
2004-10-08 13:31 ` Keith Wansbrough
2004-10-08 14:32 ` skaller
2004-10-08 14:42 ` Alex Baretta
2004-10-08 15:43 ` David Brown
2004-10-08 17:19 ` Alex Baretta
2004-10-08 23:29 ` skaller
2004-10-09 8:35 ` Keith Wansbrough
2004-10-09 9:07 ` skaller
2004-10-09 8:32 ` Keith Wansbrough
2004-10-08 17:18 ` Wolfgang Lux
2004-10-11 0:44 ` Brian Hurt [this message]
2004-10-11 6:32 ` William Lovas
2004-10-11 6:52 ` Ville-Pertti Keinonen
2004-10-13 11:29 ` Alex Baretta
2004-10-13 11:22 ` Alex Baretta
2004-10-11 9:04 ` Keith Wansbrough
2004-10-08 14:05 ` Sébastien Furic
2004-10-08 14:44 ` Alex Baretta
2004-10-08 15:09 ` Jon Harrop
2004-10-08 15:13 ` james woodyatt
2004-10-08 14:26 ` sejourne_kevin
2004-10-08 18:28 ` Alex Baretta
2004-10-11 8:01 ` Jean-Christophe Filliatre
2004-10-11 9:20 ` Diego Olivier Fernandez Pons
2004-10-11 13:38 ` [Caml-list] About Obj (was Recursive lists) Christophe Raffalli
2004-10-11 13:49 ` [Caml-list] " Christophe Raffalli
2004-10-11 15:33 ` [Caml-list] " Jon Harrop
2004-10-11 16:09 ` Richard Jones
2004-10-11 16:40 ` [Caml-list] About Obj Yamagata Yoriyuki
2004-10-13 11:59 ` Alex Baretta
2004-10-11 16:24 ` [Caml-list] About Obj (was Recursive lists) james woodyatt
2004-10-11 16:46 ` brogoff
2004-10-11 17:24 ` james woodyatt
2004-10-12 0:19 ` skaller
2004-10-20 22:10 ` Greg K
2004-10-12 15:19 ` Christophe Raffalli
2004-10-13 11:42 ` Alex Baretta
2004-10-13 21:19 ` brogoff
2004-10-14 9:52 ` Andreas Rossberg
2004-10-14 17:38 ` brogoff
2004-10-15 8:22 ` Alex Baretta
2004-10-15 17:02 ` brogoff
2004-10-17 13:42 ` Alex Baretta
2004-10-12 6:17 ` [Caml-list] Recursive lists sejourne_kevin
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.LNX.4.44.0410101928130.4934-100000@localhost.localdomain \
--to=bhurt@spnz.org \
--cc=Keith.Wansbrough@cl.cam.ac.uk \
--cc=caml-list@inria.fr \
--cc=pasckosky2000@yahoo.it \
/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