Укороти мой код - PullRequest
       9

Укороти мой код

1 голос
/ 08 марта 2011

Мой инстинкт говорит, что следующий код можно сделать короче, но я не могу понять, как.Вы можете мне помочь?

def asGraphingFunction[A : Numeric, B : Numeric](f: PartialFunction[A, B]): Double => Double = {
  val (numericA, numericB) = (implicitly[Numeric[A]], implicitly[Numeric[B]])
  (x: Double) => {
    val xa: A = numericA.fromInt(x.toInt)
    if(f.isDefinedAt(xa))
      numericB.toDouble(f(xa))
    else
      0.0
  }
}

Ответы [ 2 ]

7 голосов
/ 08 марта 2011

Два совета здесь:

  1. Поскольку вам нужны именованные экземпляры Numeric, проще просто исключить границы контекста из неявных аргументов

  2. Используйте 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
1 голос
/ 08 марта 2011

Что насчет этого?:

import scala.{ PartialFunction => PF }
def asGraphingFunction[A : Numeric, B : Numeric](f: PF[A, B]): Double => Double = {
  val pf1: PF[Double,A     ] = { case d => numericA.fromInt(d.toInt) }
  val pf2: PF[B     ,Double] = { case b => numericB.toDouble(b) }
  val pf3: PF[Double,Double] = { case _ => 0 }
  pf1 andThen f andThen pf2 orElse pf3
}

Не короче, но, возможно, яснее ?! Есть комментарии?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...