Scala: что лучший способ состоит в том, чтобы сделать числовые операции в универсальных классах?

Я думаю, что это не так легко проблема. Мы можем сказать, что застреваем с JS, но он действительно настолько плохо с jQuery, Прототипом, scriptaculous, MooTools и всеми фантастическими библиотеками?

Помнят, JS легкий вес , еще больше с V8, TraceMonkey, SquirrelFish - новые механизмы JavaScript, используемые в современных браузерах.

Это также , доказал - да, мы знаем, что это имеет проблемы, но у нас есть многие из них, в которых разбираются, как ранние проблемы безопасности. Обработка изображений разрешения браузера выполнить код Ruby или что-либо еще. Тестовая среда безопасности должна была бы быть сделана для царапины. И Вы знаете что? Люди Python уже перестали работать два раза в нем.

я думаю, что JavaScript будет пересмотренным и улучшался со временем, точно так же, как HTML и CSS. Процесс может быть долгим, но не все возможно в этом мире.

7
задан Alex Black 9 December 2009 в 02:04
поделиться

3 ответа

Вы можете использовать Границы просмотра .

Короче говоря, def foo [T <% U] (t: T) - это функция который будет принимать любой T, который либо является, либо может быть неявно преобразован в U. Поскольку Int может быть преобразован в RichInt (который содержит ваш желаемый метод), это отличный пример использования.

class MaxOfList[T <% Ordered[T]](list: List[T] ) {
  def max = {
    val seed: Option[T] = None
    list.foldLeft(seed)(getMax(_,_))
  }

  private def getMax(xOption: Option[T], y: T) = (xOption, y) match {
    case (Some(x), y) if ( x > y ) => xOption
    case (_, y) => Some(y)
  }
}

PS - Я переписал ваш getMax (...) для сравнения значений вместо самих параметров и использовал сопоставление с образцом вместо isDefined (...)

PPS - Scala 2.8 будет иметь черту Numeric, которая может оказаться полезной. http://article.gmane.org/gmane.comp.lang.scala/16608


Addendum

Просто для смеха, вот сверхкомпактная версия, которая полностью исключает метод getMax:

class MaxOfList[T <% Ordered[T]](list: List[T] ) {
  def max = list.foldLeft(None: Option[T]) {
      case (Some(x), y) if ( x > y ) => Some(x)
      case (_, y) => Some(y)
  }
}

Тем не менее Другое приложение

Эта версия была бы более эффективной для больших списков ... позволяет избежать создания Some (x) для каждого элемента:

class MaxOfList[T <% Ordered[T]](list: List[T] ) {
  def max = {
    if (list.isEmpty) None
    else Some(list.reduceLeft((a,b) => if (a > b) a else b))
  }
}

Последний, я обещаю!

На этом этапе вы можете просто отказаться от класса и использовать функцию:

  def max[T <% Ordered[T]](i: Iterable[T]) = {
    if (i.isEmpty) None
    else Some(i.reduceLeft((a,b) => if (a > b) a else b))
  }
9
ответ дан 6 December 2019 в 21:14
поделиться

С Numeric [T] в scala 2.8,

scala> case class MaxOfList[T : Numeric](list: List[T]) {
     |     def max = if(list.isEmpty) None else Some(list.max)
     | }
defined class MaxOfList

scala> MaxOfList(1::2::3::9::7::Nil).max

res1: Option[Int] = Some(9)

scala> MaxOfList(1.5::3.9::9.2::4.5::Nil).max

res2: Option[Double] = Some(9.2)

scala> MaxOfList(Nil: List[Byte]).max

res3: Option[Byte] = None

scala>
2
ответ дан 6 December 2019 в 21:14
поделиться

Как ответил Митч Блевинс , это то, для чего были сделаны границы просмотра . Теперь, хотя Numeric добавлен только в Scala 2.8, это не значит, что он не зависит от каких-либо функций Scala 2.8. То же самое можно было бы сделать в Scala 2.7.

Возможно, вас заинтересуют некоторые общие фрагменты кода, которые я написал для Rosetta Code :

1
ответ дан 6 December 2019 в 21:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: