Ваша проблема в том, что квадрат не является функцией (т. Е. Scala.Function1 [T, T] aka (T) => T).Вместо этого это метод параметризованного типа с несколькими списками аргументов, один из которых неявный ... в Scala нет синтаксиса для определения точно эквивалентной функции.
Интересно, что вы используете тип Numericкласс означает, что обычные кодировки функций более высокого ранга в Scala здесь не применяются напрямую, но мы можем адаптировать их к этому случаю и получить что-то вроде этого:
trait HigherRankedNumericFunction {
def apply[T : Numeric](t : T) : T
}
val square = new HigherRankedNumericFunction {
def apply[T : Numeric](t : T) : T = implicitly[Numeric[T]].times(t, t)
}
Это дает нам более высокий рейтинг«функция» со своим параметром типа, привязанным к Numeric,
scala> square(2)
res0: Int = 4
scala> square(2.0)
res1: Double = 4.0
scala> square("foo")
<console>:8: error: could not find implicit value for evidence parameter of type Numeric[java.lang.String]
square("foo")
Теперь мы можем определить дважды в терминах HigherRankedNumericFunctions,
def twice[T : Numeric](f : HigherRankedNumericFunction, a : T) : T = f(f(a))
scala> twice(square, 2)
res2: Int = 16
scala> twice(square, 2.0)
res3: Double = 16.0
Очевидный недостатокэтот подход заключается в том, что вы теряете краткость литералов мономорфных функций Scala.