Что-то, что я вижу на нескольких языках, это вывод типа, скажем, в Scala, что я пишу
val x = 3
Затем вывод x имеет тип Int, это довольно круто, другой пример, возможно, у меня есть ситуация, подобная
class Hi {
val f = (x: Int) => "Hi"
}
. Затем выводится, что f имеет тип Int => String.
Что меня интересует, так это обратное, данное (недопустимое )
val f = x => x.Hi(7): String
Имеет смысл сказать, что тип x имеет вид
{
Hi: 7 => String
}
Под этим подразумевается, что x - это любой объект со свойством Привет, который отображает 'type' 7 в строку.
Мне очень нравится это как идея, потому что он автоматически делает сигнатуру моей функции как generi c, поскольку это может быть дано для ее реализации.
В общем, я могу себе представить, что у меня есть некоторая функция f, скажем, параметр x, x используется в различных местах в теле f, как, может быть, у меня есть
g(x.blah(3))
Где g имеет введите X => число, где выводится X (по определению g), тогда хорошо, я просто записываю что у типа x должно быть свойство с именем blah типа 3 => X.
Имеет ли это смысл? Есть ли язык программирования с такой системой типов?
Когда я пишу Java, я чувствую, что иногда я определяю свои методы на каком-то интерфейсе, но на самом деле метод не требует всех свойств интерфейса, просто я не Я не хочу определять интерфейс для каждого метода (и мне нужно сделать соответствующую реализацию), но при этом я делаю метод менее обобщенным c, чем могло бы быть.