caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: "Loup Vaillant" <loup.vaillant@gmail.com>
To: caml-list@inria.fr
Subject: Re: [Caml-list] Pattern matching over lazy lists
Date: Wed, 11 Jul 2007 10:44:22 +0200	[thread overview]
Message-ID: <6f9f8f4a0707110144i2206c20dw22dc67ffa42a4a42@mail.gmail.com> (raw)
In-Reply-To: <200707102338.47010.jon@ffconsultancy.com>

(Sorry for the double post)

2007/7/11, Jon Harrop <jon@ffconsultancy.com>:
> What's the best way to do this?
>
> I was thinking of forcing the first few elements of a lazy list before pattern
> matching and then looking for forced values in the lists as patterns but I
> don't think you can deconstruct a lazy value in a pattern match...


You are talking about streams, right? Not just the suspension of a
regular list? Camlp4 provide "functional streams", which are not
destructive. If you don't want to use that...

...At least, you can deconstruct the very first suspension :

match force l with
| Empty -> (****)
| Cons x l -> (****)

might do it. maybe :

match hd (force l) with
| 0 -> (****)
| x -> (****)

would be better for your purpose.

However, with more than one element (3 here) :

match
 hd (force l),
 hd (force (tl (force l))),
 hd (force (tl (force (tl (force l)))))
with
| 0, 0, 0 -> (****)
| x, y, z -> (****)

Quite ugly. In that case, I suggest you write a "peek_n" function
which take a stream as input, and provide you a list (or tuple, or
whatever) as output, so you can match it directly :

match peek_n 3 l with
| [0; 0; 0] -> (****)
| [x; y; z] -> (****)
| _ -> failwith "impossible error"

Did I answer your question?

Loup Vaillant

PS :

> I don't think you can deconstruct a lazy value in a pattern match...

Why not? A lazy value is a value like any other. (Whoops, I just
looked at the Lazy module, which hide some magic... compiler
optimizations?)


  reply	other threads:[~2007-07-11  8:44 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-10 22:38 Jon Harrop
2007-07-11  8:44 ` Loup Vaillant [this message]
2007-07-11 11:13 ` [Caml-list] " Markus E.L.
2007-07-11 15:51 ` Martin Jambon

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=6f9f8f4a0707110144i2206c20dw22dc67ffa42a4a42@mail.gmail.com \
    --to=loup.vaillant@gmail.com \
    --cc=caml-list@inria.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).