Начальная нота:
Этот вопрос был закрыт после нескольких правок, потому что мне не хватало правильной терминологии, чтобы точно указать, что я искал. Затем Сэм Тобин-Хохштадт опубликовал комментарий, который позволил мне точно понять, что это было: языки программирования, которые поддерживают типы пересечений для возвращаемых значений функций.
Теперь, когда вопрос был вновь открыт, я решил улучшить его, переписав его (надеюсь) более точно. Поэтому некоторые ответы и комментарии ниже могут больше не иметь смысла, поскольку они ссылаются на предыдущие изменения. (Пожалуйста, смотрите историю редактирования вопроса в таких случаях.)
Существуют ли какие-либо популярные статически и строго типизированные языки программирования (такие как Haskell, универсальный Java, C #, F # и т. Д.), Которые поддерживают типы пересечений для возвращаемых значений функции? Если да, то что и как?
(Если честно, мне бы очень хотелось, чтобы кто-то продемонстрировал способ выражения типов пересечений в основном языке, таком как C # или Java.)
Я приведу краткий пример того, как могут выглядеть типы пересечений, используя некоторый псевдокод, похожий на C #:
interface IX { … }
interface IY { … }
interface IB { … }
class A : IX, IY { … }
class B : IX, IY, IB { … }
T fn() where T : IX, IY
{
return … ? new A()
: new B();
}
То есть функция fn
возвращает экземпляр некоторого типа T
, о котором вызывающая сторона знает только то, что она реализует интерфейсы IX
и IY
. (То есть, в отличие от обобщений, вызывающая сторона не может выбрать конкретный тип T
- функция делает. Из этого я бы предположил, что T
на самом деле это не универсальный тип, а экзистенциальный тип.)
PS: я знаю, что можно просто определить interface IXY : IX, IY
и изменить тип возвращаемого значения fn
на IXY
. Однако это не совсем то же самое, потому что часто вы не можете подключить дополнительный интерфейс IXY
к ранее определенному типу, A
который реализуется только IX
и IY
отдельно.
Сноска. Некоторые ресурсы о типах перекрестков:
Статья в Википедии для «Системы типов» содержит подраздел о типах пересечений .
Доклад Бенджамина С. Пирса (1991), «Программирование с типами пересечений, типов соединений и полиморфизма»
Дэвид П. Каннингем (2005), "Типы пересечений на практике" , который содержит тематическое исследование о языке Форсайт, которое упоминается в статье Википедии.
Вопрос переполнения стека, «Типы объединения и типы пересечений», который получил несколько хороших ответов, среди них этот, который дает пример псевдокода типов пересечений, подобных моему выше.
T
как интерфейс, I
когда он реализует все методы интерфейса, но не объявляет этот интерфейс».
T
определяет тип, даже если он просто определен в объявлении функции как «некоторый тип, который расширяет / реализуетIX
иIY
». Тот факт, что фактическое возвращаемое значение является частным случаем этого (A
или,B
соответственно), здесь не является чем-то особенным, вы также можете достичь этого, используяObject
вместоT
.