Я думаю, что причина, по которой Scala требует аннотации типов для параметров вновь определенной функции, заключается в том, что Scala использует более локальный анализ вывода типов, чем тот, который используется в Haskell.
Если все ваши классы смешаны в признаке, скажем Addable[T]
, в котором объявлен оператор +
, вы можете написать свою общую функцию добавления как:
def add[T <: Addable[T]](x : T, y : T) = x + y
Это ограничивает функцию добавления типами T, которые реализуют свойство Addable.
К сожалению, в современных библиотеках Scala такой черты нет. Но вы можете увидеть, как это будет сделано, если взглянуть на похожий случай - черту Ordered[T]
. Эта черта объявляет операторы сравнения и смешивается классами RichInt
, RichFloat
и т. Д. Затем вы можете написать функцию сортировки, которая может взять, например, List[T]
, где [T <: Ordered[T]]
, чтобы отсортировать список элементов, которые смешиваются в упорядоченном признаке. Из-за неявных преобразований типов, таких как Float
в RichFloat
, вы даже можете использовать свою функцию сортировки в списках Int
, или Float
, или Double
.
.
Как я уже сказал, к сожалению, для оператора +
нет соответствующей черты. Итак, вам придется выписать все самостоятельно. Вы должны использовать черту Addable [T], создавать AddableInt
, AddableFloat
и т. Д., Классы, расширяющие Int, Float и т. Д., Смешиваться в черте Addable и, наконец, добавлять неявные функции преобразования, например, для поворота. и Int в AddableInt
, чтобы компилятор мог создать экземпляр и использовать функцию add с ним.