Початкова примітка:
Це питання було закрито після декількох редагувань, оскільки мені не вистачало належної термінології, щоб точно сказати, що я шукав. Тоді Сем Тобін-Хохштадт опублікував коментар, який змусив мене розпізнати саме це: мови програмування, які підтримують типи перетину для повернення значень функції.
Тепер, коли питання було знову відкрито, я вирішив його покращити, переписавши його (сподіваюся) більш точним чином. Тому деякі відповіді та коментарі нижче можуть більше не мати сенсу, оскільки вони посилаються на попередні зміни. (Будь ласка, перегляньте історію редагування питання в таких випадках.)
Чи є якісь популярні статично і сильно набрані мови програмування (такі як 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: Я знаю, що можна просто визначити a interface IXY : IX, IY
і змінити тип повернення fn
на IXY
. Однак це насправді не те саме, тому що часто ви не можете підключити додатковий інтерфейс IXY
до визначеного раніше типу, A
який реалізується лише IX
та IY
окремо.
Виноска. Деякі ресурси щодо типів перетину:
Стаття у Вікіпедії для "Тип системи" має підрозділ про типи перетину .
Доповідь Бенджаміна Ч. Пірса (1991), "Програмування з типами перетину, типами союзу та поліморфізмом"
Девід П. Каннінгем (2005), "Типи перетину на практиці" , який містить тематичне дослідження мови Форсайта, про яке йдеться у статті Вікіпедії.
Питання про переповнення стека, "Типи об'єднань та перетину", які отримали кілька хороших відповідей, серед них і цей, який дає приклад псевдокоду типів перетину, подібних до моїх вище.
T
як інтерфейс, I
коли він реалізує всі методи інтерфейсу, але не оголосив цей інтерфейс".
T
визначає тип, навіть якщо він просто визначений у оголошенні функції як "деякий тип, який розширює / реалізуєIX
таIY
". Той факт, що фактичне повернене значення є особливим випадком, що (A
абоB
відповідно) тут не є особливим, ви можете так само добре досягти цього, використовуючиObject
замість цьогоT
.