Это интересный вопрос, и я дам свои 2 цента.
Прежде всего воспротивитесь стремлению к преждевременной оптимизации.Убедитесь, что неполная функция является проблемой.Я был поражен тем, как быстро они работают в некоторых случаях.
Теперь, если предположить, что есть проблема, откуда она взялась?
- Может быть большое количество случаев
- Сложное сопоставление с образцом
- Некоторые сложные вычисления по причинам if
Один из вариантов, который я бы попытался найти, чтобы быстро потерпеть неудачу.Разбейте сопоставление с образцом на слой, затем объедините частичные функции.Таким образом, вы можете провалить матч рано.Также извлеките повторное совпадение.Например:
Предположим, OddEvenList - это экстрактор, который разбивает список на нечетный и четный список:
var pf1: PartialFuntion[List[Int],R] = {
case OddEvenList(1::ors, 2::ers) =>
case OddEvenList(3::ors, 4::ors) =>
}
Разбить на две части, одну, которая соответствует разбиению, затем ту, котораяпытается сопоставить результат (чтобы избежать повторных вычислений. Однако это может потребовать некоторой реинжиниринга
var pf2: PartialFunction[(List[Int],List[Int],R) = {
case (1 :: ors, 2 :: ers) => R1
case (3 :: ors, 4 :: ors) => R2
}
var pf1: PartialFuntion[List[Int],R] = {
case OddEvenList(ors, ers) if(pf2.isDefinedAt(ors,ers) => pf2(ors,ers)
}
. Я использовал это при последовательном чтении файлов XML, которые имеют довольно непостоянный формат.
Другой вариант - составить частичные функции, используя andThen
. Хотя быстрый тест, показанный здесь, показывает, что только первый из них - это тесты.