Два совета здесь:
Поскольку вам нужны именованные экземпляры Numeric
, проще просто исключить границы контекста из неявных аргументов
Используйте PartialFunction#lift
для преобразования PartialFunction[A,B]
в A => Option[B]
Тогда снимите шаблон и ... вуаля!
def asGraphingFunction[A, B](f: PartialFunction[A, B])
(implicit numA: Numeric[A], numB: Numeric[B]) =
(x: Double) => f.lift(numA fromInt x.toInt) map (numB.toDouble) getOrElse 0.0
Если вы используете оператор прямого канала (либо из scalaz, либо как определено здесь ), то его можно сделать еще более разборчивым:
def asGraphingFunction[A, B](f: PartialFunction[A, B])
(implicit numA: Numeric[A], numB: Numeric[B]) =
(x: Double) => (numA fromInt x.toInt) |> f.lift map (numB.toDouble) getOrElse 0.0
Обновление
Поскольку вы конвертируете только int / double, вам вообще не нужно Numeric
, вы можете делать все через java.util.Number
, в процессе отбрасывая параметры типа:
def asGraphingFunction(f: PartialFunction[Number, _ <: Number]) =
(x: Number) => f.lift(x.intValue) map (_.doubleValue) getOrElse 0.0