Вполне возможно, что для того, чтобы узнать, определена ли функция в какой-то момент, необходимо выполнить значительную часть вычисления ее значения. В PartialFunction
при реализации isDefined
и применить
оба метода должны будут это делать. Что делать, если эта обычная работа стоит дорого?
Существует возможность кэширования его результата в надежде, что apply будет вызван после isDefined. Определенно некрасиво.
Я часто хочу, чтобы PartialFunction [A, B]
была Function [A, Option [B]]
, которая явно изоморфна. Или, может быть, в PartialFunction
может быть другой метод, скажем applyOption (a: A): Option [B]
. С некоторыми миксинами у разработчиков будет выбор: реализовать isDefined и apply или applyOption. Или все они на всякий случай с точки зрения производительности. Клиентам, которые проверяют isDefined
непосредственно перед вызовом apply, рекомендуется использовать вместо него applyOption
.
Однако это не так. Некоторые основные методы в библиотеке, среди которых сбор
в коллекциях, требуют PartialFunction
. Есть ли чистый (или не очень чистый) способ избежать оплаты вычислений, повторяющихся между isDefined и apply?
Также, разумен ли метод applyOption (a: A): Option [B]
? Возможно ли добавить его в будущую версию? Стоит ли?