Есть ли стандартный способ завершить частичную функцию PartialFunction[A, B]? Что-то вроде этого:

completePartialFunction(pf: PartialFunction[A, B], z: B): A => B

Или в более общем смысле

completePartialFunction2(pf: PartialFunction[A, B], f: A => B): A => B
2
Nicolas Heimann 18 Авг 2020 в 10:06

4 ответа

Лучший ответ

Да, на самом деле все очень просто:

  def complete[A, B](pf: PartialFunction[A, B])(f: A => B): A => B =
    pf.applyOrElse(_, f)
4
Matthias Berndt 18 Авг 2020 в 07:58

Вы можете использовать метод lift для PartialFunction, который возвращает Option[B]. Поэтому, когда функция не определена для ввода, возвращается None. Дополнительную информацию можно найти в scaladocs.

Другое решение, которое приходит мне в голову, - это использование кошек или scalaz. Затем вы можете проверить, определена ли функция для аргумента, а если нет, вернуть empty из Monoid[B], который вы должны передать (возможно, неявно) в completePartialFunction.

5
Andronicus 18 Авг 2020 в 07:10

Если я понимаю вопрос, вы хотите использовать f() для дополнения pf(), чтобы охватить все возможные значения типа A.

def completePartialFunction2[A,B](pf : PartialFunction[A,B]
                                 ,f  : A => B): A => B =
  (a:A) => if (pf.isDefinedAt(a)) pf(a) else f(a)
2
jwvh 18 Авг 2020 в 07:47

Еще одна простая версия:

def completePartialFunction[A, B](pf: PartialFunction[A, B], f: A => B): A => B
  = pf orElse { case a: A => f(a) }
1
Tim 18 Авг 2020 в 12:09