Uwaga wstępna:
To pytanie zostało zamknięte po kilku edycjach, ponieważ brakowało mi odpowiedniej terminologii, aby dokładnie określić, czego szukałem. Sam Tobin-Hochstadt opublikował następnie komentarz, dzięki któremu rozpoznałem dokładnie, co to było: języki programowania obsługujące typy przecięć dla zwracanych wartości funkcji.
Teraz, gdy pytanie zostało ponownie otwarte, postanowiłem je poprawić, przepisując je w (mam nadzieję) bardziej precyzyjny sposób. Dlatego niektóre poniższe odpowiedzi i komentarze mogą nie mieć sensu, ponieważ odnoszą się do poprzednich edycji. (W takich przypadkach zapoznaj się z historią edycji pytania).
Czy są jakieś popularne statycznie i silnie typowane języki programowania (takie jak Haskell, ogólna Java, C #, F # itp.), Które obsługują typy przecięć dla zwracanych wartości funkcji? Jeśli tak, to jakie i jak?
(Szczerze mówiąc, bardzo chciałbym zobaczyć, jak ktoś demonstruje sposób wyrażania typów skrzyżowań w głównym nurcie, takim jak C # lub Java.)
Dam szybki przykład tego, jak mogą wyglądać typy skrzyżowań, używając jakiegoś pseudokodu podobnego do 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();
}
Oznacza to, że funkcja fn
zwraca instancję pewnego typu T
, o której program wywołujący wie tylko, że implementuje interfejsy IX
i IY
. (To znaczy, w przeciwieństwie do generycznych, osoba wywołująca nie może wybrać konkretnego typu T
- funkcja działa. Z tego przypuszczam, że T
w rzeczywistości nie jest to typ uniwersalny, ale typ egzystencjalny.)
PS: Wiem, że można po prostu zdefiniować a interface IXY : IX, IY
i zmienić typ zwracanego fn
na IXY
. Jednak tak naprawdę nie jest to to samo, ponieważ często nie można podłączyć dodatkowego interfejsu IXY
do wcześniej zdefiniowanego typu, A
który tylko implementuje IX
i IY
osobno.
Przypis: Niektóre zasoby na temat typów skrzyżowań:
Artykuł w Wikipedii dla „Systemu typów” zawiera podrozdział o typach skrzyżowań .
Raport Benjamina C. Pierce'a (1991), „Programowanie z typami skrzyżowań, typami Unii i polimorfizmem”
David P. Cunningham (2005), „Typy skrzyżowań w praktyce” , który zawiera studium przypadku dotyczące języka Forsythe, o którym wspomniano w artykule w Wikipedii.
Pytanie przepełnienia stosu, „Typy Unii i typy skrzyżowań”, które otrzymało kilka dobrych odpowiedzi, w tym to, które daje pseudokodowy przykład typów skrzyżowań podobny do mojego powyżej.
T
jako interfejs, I
gdy implementuje on wszystkie metody interfejsu, ale nie zadeklarował tego interfejsu”.
T
definiuje typ, nawet jeśli jest on zdefiniowany w deklaracji funkcji jako „jakiś typ, który rozszerza / implementujeIX
iIY
”. Fakt, że faktyczna wartość zwracana jest szczególnym przypadkiem tego (A
lubB
odpowiednio), nie jest tu niczym szczególnym, równie dobrze można to osiągnąć, używającObject
zamiast tegoT
.