Я пытаюсь отделить обычное поведение от длинных операторов сопоставления шаблонов с DRY кодом моего кода. Идея состоит в том, чтобы связать общий код с частичными функциями и оценить его с помощью оператора соответствия. Мой идеал - это что-то вродеЦепочные частичные функции с утверждениями соответствия
type pf = PartialFunction[Int, String]
// Our common behaviour
val common: pf = {
case 0 ⇒ "zero"
case 1 ⇒ "one"
}
val a = 2
// speculative match statement with extended behaviour
val b = a match (common orElse {
case 2 ⇒ "two"
case 3 ⇒ "three"
case _ ⇒ "None"
})
К сожалению, аргумент утверждения соответствия, по-видимому, не является частичной функцией. Очевидно, что проблема может быть решена с помощью частичных функций, этот код делает трюк, но я теряю на традиционном синтаксисе матча картины:
val c: String = (common orElse {
case 2 ⇒ "two"
case 3 ⇒ "three"
case _ ⇒ "None"
}: pf)(a)
В приведенном ниже примере на уродливой стороне то, что я ищу. Он компилируется, но не с scala.MatchError
, если аргумент a
не определен в частичной функции common
.
val d = common(a) orElse (a match {
case 2 ⇒ "two"
case 3 ⇒ "three"
case _ ⇒ "None"
})
Я ищу следующие ответы:
- Почему аргумент заявления матча не переведен на частичную функцию?
- Почему уродливый пример выше не работает?
- Есть ли умный способ достижения цели?