Re: slightly too(?) complex list pattern matching
Hal Daume III <hdaume@ISI.EDU> writes:
Hi all,
I don't think I can do this, but I figured I'd ask anyway. Suppose I have:
data X = X | Y | Z
and I want to match against a list of Xs. But all I want is to ensure that there's a Y followed by a Z, but I don't care if there's anything else (or lots of other stuff) in between. Namely, I want to match:
.*Y.*Z.*
I think that http://www.dcs.gla.ac.uk/~meurig/regexp has some stuff for you
Now, I can match YZ.* easily with:
foo (X:Y:_) = ...
furthermore, my matches never require any backtracking, so you won't see something like ".*X.*Y.*X.*Z" which could possibly make you backtrack (so, there are no duplicates in what I'm matching against).
Anway, the current way I do this is by having a function:
match [] _ = True match (m:ms) (x:xs) | m == x = match ms xs | otherwise = match (m:ms) xs
(Actually, I do a bit more -- I return Maybe [Int] where Nothing signifies that the match failed and Just intList specifies the indices of the matched elements, but this is superfluous).
so this requires me to write things like:
foo l | Just indices <- [X,Y] `match` l = let [x,y] = map (l!!) indices in ...
instead of the nice haskellesque syntax:
foo [..,x@X,..,y@Y,..] = ...
anyway, I'm curious if anyone else has pounded against this wall at all and if there's any tool (drift, or something perhaps) that would allow me to write more succinct versions?
Thanks!
- Hal
-- Hal Daume III
"Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume
_______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell
-- Yoann Padioleau, INSA de Rennes, France, Opinions expressed here are only mine. Je n'écris qu'à titre personnel. **____ Get Free. Be Smart. Simply use Linux and Free Software. ____**
participants (1)
-
Yoann Padioleau