I’d like to be able to use a single variable multiple times within one pattern, so that it will only match if the same value is present in all places, such as
list match {
case x :: x :: xs => // recurse
}
which would match List(1,1,2) but would not match List(1,2,1). But this does not compile with error: x is already defined as value x.
In researching this question, I found out that I can also include a guard in the case clause, so I can do
list match {
case x1 :: x2 :: xs if x1==x2 => // recurse
}
which seems to work the same way (it does, right?). This is good, but it wouldn’t look as clean if I wanted the same value in many places, like
list match {
case x1::x2::x3::x4::xs if x1==x2 && x2==x3 && x3==x4 => // recurse
}
Is there any more elegant way I can do this?
A few notes: Yes, I am just learning scala, if that wasn’t clear, so I’m not sure this is something I’d ever really want to do, but I’m just interested in what’s possible. In that regard, I’m not really looking for a completely different solution, like takeWhile or filter or something, but more so am specifically interested in pattern matching.
Scala doesn’t provide quite that much flexibility with its matches (which may be a good thing, as one has to be aware of errors arising from unintentional variable re-use).
If you have a large number of identical items, you might want to consider a nested match (but note that you won’t fail out of the inner match to be completed later down the outer match, so you have to handle everything locally):
Note the backticks which mean “we’ve already got this variable, check against it, don’t set it!”.
Alternatively, if you have specialized functionality that you use repeatedly, you can create a custom matcher:
and then use it whenever you need that complicated pattern:
Neither of these are quite as tidy and flexible as what you were apparently hoping for, but then again, I’m not sure flipping between assigning and testing the same variable in a match statement is a good way to write clear code anyway.