Выражая квадрат в Scala

По какой-то причине (которая ускользает от меня) библиотека Scala math не имеет функции pow для целых чисел, но только для Double s.

Мне нужна квадратная функция для целых чисел, и выяснилось, что может быть обычным способом сделать это в Scala.

object TestX extends App {

  def pow2(v: Int)= v*v

  //class MyRichInt( val v: Int ) {
  //  def ² : Int = v*v      // says: "illegal character" for UTF-8 power-of-two
  //}

  println( pow2(42) )
  //println( 42² )
  println( math.pow(42,2).toInt )
}

Я был удивлен, увидев, что символ "²" не нравится Scala. Может быть, это номер? Обычно все виды странных значений Юникода действительны, и использование 422 в коде действительно было бы фантазией.

Ничего. Должен ли я заткнуться и начать использовать собственную функцию pow2?

Ответ 1

Да, используйте свой собственный pow2. Если вам нужны более высокие полномочия, у вас, вероятно, не будет места в Int. Рассмотрим использование BigInt.pow:

scala> BigInt(40).pow(40)
res0: scala.math.BigInt = 12089258196146291747061760000000000000000000000000000000000000000

Конечно, если вам не нужно N 2 но 2 N просто используйте сдвиги. (1 << k= 2 k) Они также работают с BigInt.

Ответ 2

Используйте обратные ссылки для символов Юникода и неявные классы (Scala 2.10), чтобы добавить операцию на произвольные типы:

implicit class PowerInt(i: Int) {
  def `²`: Int = i * i
}

Использование:

3 `²`

Результат:

9