I've wrote two equivalent functions in Rust, one compiles the other doesn't.
Program 1:
pub fn majority_element<T: Eq>(nums: &[T]) -> Option<&T> {
nums.iter().fold(None, |acc, curr| {
match acc {
None => Some((1, curr)),
Some((0, prev)) if prev != curr => Some((1, curr)),
Some((count, prev)) => Some((count + if prev == curr { 1 } else { -1 }, prev)),
}
}).map(|(_, val)| val)
}
program 2 (doesn't compile)
pub fn majority_element<T: Eq>(nums: &[T]) -> Option<&T> {
nums.iter().fold(None, |acc, curr| {
match acc {
None => Some((1, curr)),
Some((0, prev)) if prev != curr => Some((1, curr)),
Some((count, prev)) if prev == curr => Some((count + 1, prev)),
Some((count, prev)) if prev != curr => Some((count - 1, prev)),
}
}).map(|(_, val)| val)
}
error[E0004]: non-exhaustive patterns: `Some(_)` not covered
--> src/lib.rs:3:15
|
3 | match acc {
| ^^^ pattern `Some(_)` not covered
|
I prefer the second one because it expresses more clearly my intent.
Is this a compiler quirk or my pattern is actually not exhaustive? (and if so what am I missing?)
The type of acc is: Option<(usize, &T)>