Защитное выражение делает ваш шаблон неисчерпывающим. Рассмотрим:
val f: PartialFunction[(String, (Int, Int)), (String, Int)] = {
case (k, (v1,v2)) if v1 < v2 => (k,v1)
}
f.isDefinedAt(("foo", (0, 1)))
// Boolean = true
против.
f.isDefinedAt(("foo", (1, 0)))
// Boolean = false
Вы должны сбросить защитное выражение:
val g: PartialFunction[(String, (Int, Int)), (String, Int)] = {
case (k, (v1,v2)) => if(v1 < v2) (k,v1) else (k, v2)
}
g.isDefinedAt(("foo", (1, 0)))
// Boolean = true
g.isDefinedAt(("foo", (0, 1)))
// Boolean = true
или указать значение по умолчанию:
val h: PartialFunction[(String, (Int, Int)), (String, Int)] = {
case (k, (v1,v2)) if v1 < v2 => (k, v1)
case (k, (_, v2)) => (k, v2)
}
h.isDefinedAt(("foo", (0, 1)))
// Boolean = true
h.isDefinedAt(("foo", (1, 0)))
// Boolean = true