Есть ли стандартный способ завершить частичную функцию PartialFunction[A, B]
? Что-то вроде этого:
completePartialFunction(pf: PartialFunction[A, B], z: B): A => B
Или в более общем смысле
completePartialFunction2(pf: PartialFunction[A, B], f: A => B): A => B
4 ответа
Да, на самом деле все очень просто:
def complete[A, B](pf: PartialFunction[A, B])(f: A => B): A => B =
pf.applyOrElse(_, f)
Вы можете использовать метод lift
для PartialFunction
, который возвращает Option[B]
. Поэтому, когда функция не определена для ввода, возвращается None
. Дополнительную информацию можно найти в scaladocs.
Другое решение, которое приходит мне в голову, - это использование кошек или scalaz. Затем вы можете проверить, определена ли функция для аргумента, а если нет, вернуть empty
из Monoid[B]
, который вы должны передать (возможно, неявно) в completePartialFunction
.
Если я понимаю вопрос, вы хотите использовать 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)
Еще одна простая версия:
def completePartialFunction[A, B](pf: PartialFunction[A, B], f: A => B): A => B
= pf orElse { case a: A => f(a) }
Похожие вопросы
Новые вопросы
scala
Scala - это язык программирования общего назначения, в основном предназначенный для виртуальной машины Java. Разработанный для краткого, элегантного и безопасного для типов представления общих шаблонов программирования, он сочетает в себе как императивный, так и функциональный стили программирования. Его ключевые особенности: продвинутая система статического типа с выводом типа; типы функций; сопоставления с образцом ; неявные параметры и преобразования; перегрузка оператора; полная совместимость с Java; совпадение