Есть ли способ использовать оператор «+» как дополнение к параметрам, передаваемым методу как универсальному типу в Scala? - PullRequest
0 голосов
/ 03 мая 2019

Я недавно обнаружил Scala, и я написал решатель RK4, который я пытаюсь обобщить как можно больше. После того, как он работал с произвольно большими системами, я хотел, чтобы он работал с произвольными числовыми типами данных, но я наткнулся на стену. Когда я использую общий тип данных, независимо от того, какие ограничения я на него накладываю, Scala автоматически конвертирует все в строки, чтобы использовать '+'.

Большая часть того, что я до сих пор пробовал, в конечном итоге писала одно и то же по-разному. Я мог бы явно преобразовать все в тип с наивысшей точностью, который я буду использовать (BigDecimal), и называть его днем, но это упускает большую часть смысла обобщать функцию.

Это не вся моя программа на RK4, но это один кусок кода, который я портил за последние пару часов:

def vecSum[T : Numeric]( u: Vector[T], v: Vector[T]): Vector[T] = (u, v).zipped.map(_ + _)

Это векторная сумма (математический вектор, структура данных просто случайная), которая принимает два вектора и возвращает один вектор, где каждый элемент является суммой двух соответствующих элементов во входных векторах.

Я пытаюсь заставить его возвращать вектор того же числового типа, что и входные данные, но он хочет только выплюнуть вектор строк.

1 Ответ

1 голос
/ 03 мая 2019

Используйте

  def vecSum[T](u: Vector[T], v: Vector[T])(implicit o: Numeric[T]): Vector[T] = (u, v).zipped.map((x, y) => o.plus(x, y))

Если вы специально хотите использовать +, вы можете использовать

import Numeric.Implicits._
def vecSum2[T: Numeric](u: Vector[T], v: Vector[T]): Vector[T] = {
  (u, v).zipped.map((x, y) => x + y)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...