Я не знаю ни одного языка, который делает это ... к сожалению, я бы хотел поиграть с этим (но сначала они должны принять вывод типов и параметрический полиморфизм;)).
Хотя это уже возможно: относительно элегантно в структурной системе типов (тип a является подтипом типа b, если a имеет все, что имеет b), просто указав тип для значения, являющегося структурным подтипом BigInteger
и Double
и Nil
и немного менее элегантно в системе именительного типа (тип a является подтипом типа b в том и только в том случае, если он наследует от него, прямо или косвенно) путем указания общего предка всех трех (если все иначе не удается, object
). Конечно, нам нужно идти рекурсивно - какой тип toString? И какой тип (Integer | Double | BigInteger).+
?!? Это далеко не тривиально (на самом деле, поиск решения сделал мою голову немного болит). Я не могу сказать, если это невозможно, но ни одна система типов, основанная на языке OO, не является достаточно сложной для возможного решения.
Суть в том, что было бы действительно здорово , если бы появился какой-то свист и разобрался с проблемами, которые он поднимает. Вероятно, не стоит усилий ...
Редактировать: Знаете ли вы алгебраические типы данных ? Они похожи на вашу идею (но намного старше;)) в том, что алгебраический тип данных состоит из нескольких типов и, следовательно, может содержать, например, BigInteger, Double и Nil - фактическое значение является одним из них, и тег (как в tagged union ) говорит о том, какой. Но чтобы использовать значение, хранящееся в алгебраическом типе данных, вы должны использовать сопоставление с шаблоном для его безопасного извлечения. Эта концепция очень мощная и все же достаточно "простая", чтобы ее можно было понять инструментами - например, вывод типа и статическая проверка типов.