Version française
Home     About     Download     Resources     Contact us    
Browse thread
Pattern matching over lazy lists
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Loup Vaillant <loup.vaillant@g...>
Subject: Re: [Caml-list] Pattern matching over lazy lists
(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?)