Вы можете определить square
как:
def square[T: Numeric](x: T): T = implicitly[Numeric[T]].times(x,x)
Преимущество этого подхода заключается в том, что он будет работать для любого типа T, который имеет неявное преобразование в Numeric [T] (т. Е. Int, Float, Double, Char, BigInt, ... или любой тип, для которого вы предоставляете неявное преобразование).
Edit:
К сожалению, у вас возникнут проблемы, если вы попробуете что-то вроде List(1,2,3).map(square)
(в частности, вы получите ошибку компиляции, такую как «не удалось найти неявное значение для параметра доказательства типа Numeric [T]». Чтобы избежать этой проблемы, может перегрузить square
для возврата функции:
object MyMath {
def square[T: Numeric](x: T) = implicitly[Numeric[T]].times(x,x)
def square[T: Numeric]: T => T = square(_)
}
Надеюсь, кто-то с лучшим пониманием механизма вывода типов объяснит, почему это так.
В качестве альтернативы можно позвонить List(1,2,3).map(square(_))
, как указал Дерек Уильямс в ветке списка рассылки для пользователей scala .