[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ 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?)