Произвольная функция применяла postfix в Scala [duplicate]

В дополнение к другим правильным ответам вы можете рассмотреть возможность масштабирования ваших значений, чтобы избежать проблем с арифметикой с плавающей запятой.

Например:

var result = 1.0 + 2.0;     // result === 3.0 returns true

... вместо:

var result = 0.1 + 0.2;     // result === 0.3 returns false

Выражение 0.1 + 0.2 === 0.3 возвращает false в JavaScript, но, к счастью, целочисленная арифметика в плавающей запятой является точной, поэтому ошибки с десятичным представлением можно избежать путем масштабирования.

В качестве практического примера, чтобы избежать проблем с плавающей запятой, где точность имеет первостепенное значение, рекомендуется обрабатывать деньги как целое число, представляющее число центов: 2550 центов вместо 25.50 долларов.


1 Дуглас Крокфорд: JavaScript: Хорошие детали: Приложение A - Ужасные части (стр. 105) .

0
задан user 28 February 2016 в 23:29
поделиться

3 ответа

Я не думаю, что это возможно со стандартной scala. Но вы можете написать некоторые вспомогательные методы, которые сделали бы что-то вроде этого доступным:

implicit class Applied1[T](val t: T) extends AnyVal {
  def applied[R](f: T => R): R = f(t)
}

implicit class Applied2[T1, T2](val t: (T1, T2)) extends AnyVal {
  def applied[R](f: (T1, T2) => R): R = f(t._1, t._2)
}

implicit class Applied3[T1, T2, T3](val t: (T1, T2, T3)) extends AnyVal {
  def applied[R](f: (T1, T2, T3) => R): R = f(t._1, t._2, t._3)
}

// ... and 19 more implicit classes: Applied4 to Applied22

И тогда вы можете использовать его следующим образом:

def minus(a: Int): Int = -a
def plus(a: Int, b: Int): Int = a + b
def plus(a: Int, b: Int, c: Int): Int = a + b + c

scala> 5 applied minus
res0: Int = -5

scala> (1, 2) applied plus
res1: Int = 3

scala> (1, 2, 3) applied plus
res2: Int = 6

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

def mul[T : Numeric](a: T, b: T): T = {
  import Numeric.Implicits._
  a * b
}

scala> (1.5, 2.5) applied (mul(_, _))
res3: Double = 3.75
6
ответ дан Kolmar 26 August 2018 в 06:28
поделиться

В Scala список параметров функции всегда записывается перед функцией:

val fn = (a: Int, b: Int) => a + b
//       ^  parameters  ^    ^ function
-3
ответ дан Jörg W Mittag 26 August 2018 в 06:28
поделиться

Неявные классы могут использоваться для достижения чего-то похожего на то, что вы ищете.

Неявный класс с одним аргументом конструктора может использоваться как шаблон для добавления методов в определенного типа. Одним из примеров является DurationInt, который «добавляет» методы к целым числам, чтобы преобразовать их в длительности. Он импортируется в область видимости с помощью import scala.concurrent.duration._

. Упрощенная версия DurationInt может быть определена следующим образом:

implicit class DurationInt(n: Int) {
  def seconds: FiniteDuration = Duration(n, TimeUnit.SECONDS)
}

Это позволяет использовать метод секунд для всех целых чисел

2.seconds // Returns a duration object

Для функций с несколькими аргументами вы можете использовать аргумент кортежа для неявного класса:

implicit class TupleConcat(tuple: (String, String)) {
  def concat: String = tuple._1 + tuple._2
}

// enables the following syntax
("aa", "bb").concat

Обычно для неявных классов, например, для расширения AnyVal, это позволяет некоторым компиляторам оптимизаций, которые во многих случаях не позволяют создавать экземпляр неявного класса.

implicit final class DurationInt(val n: Int) extends AnyVal { /* implementation */ }
3
ответ дан Wellingr 26 August 2018 в 06:28
поделиться
Другие вопросы по тегам:

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