Я заметил разницу в выводе типа Scala при применении к def и val.
Используя def, я могу определить абстрактный нулевой метод const, возвращающий некоторое значение типа Int => Int. При реализации const с литералом функции мне не нужно указывать тип параметра, поскольку он может быть выведен компилятором:
trait D {
def const: Int => Int
}
object D extends D {
def const = i => i + 1
}
Это нормально. (С другой стороны, создается новый экземпляр функции для каждого доступа к D.const.)
Теперь рассмотрим аналогичную конструкцию с использованием val:
trait V {
val const: Int => Int
}
object V extends V {
val const = i => i + 1
}
Это не будет компилироваться, не с помощью
error: missing parameter type
val const = i => i + 1
^
Почему?