Nota inicial:
Esta pregunta se cerró después de varias ediciones porque carecía de la terminología adecuada para indicar con precisión lo que estaba buscando. Sam Tobin-Hochstadt luego publicó un comentario que me hizo reconocer exactamente qué era eso: lenguajes de programación que admiten tipos de intersección para valores de retorno de funciones.
Ahora que la pregunta ha sido reabierta, he decidido mejorarla reescribiéndola de una manera (con suerte) más precisa. Por lo tanto, algunas respuestas y comentarios a continuación pueden no tener sentido porque se refieren a ediciones anteriores. (Consulte el historial de edición de la pregunta en tales casos).
¿Existen lenguajes de programación populares tipados estáticamente y fuertemente (como Haskell, Java genérico, C #, F #, etc.) que admiten tipos de intersección para valores de retorno de funciones? Si es así, ¿cuál y cómo?
(Si soy sincero, me encantaría ver a alguien demostrar una forma de expresar los tipos de intersección en un lenguaje convencional como C # o Java).
Daré un ejemplo rápido de cómo se verían los tipos de intersección, usando un pseudocódigo similar a 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();
}
Es decir, la función fn
devuelve una instancia de algún tipo T
, de la cual la persona que llama solo sabe que implementa interfaces IX
y IY
. (Es decir, a diferencia de los genéricos, la persona que llama no puede elegir el tipo concreto de T
- la función sí. De esto supongo que T
en realidad no es un tipo universal, sino un tipo existencial).
PD: Soy consciente de que uno podría simplemente definir ay interface IXY : IX, IY
cambiar el tipo de retorno de fn
a IXY
. Sin embargo, eso no es realmente lo mismo, porque a menudo no puede atornillar una interfaz adicional IXY
a un tipo definido previamente A
que solo se implementa IX
y por IY
separado.
Nota al pie: Algunos recursos sobre tipos de intersección:
El artículo de Wikipedia para "Sistema de tipos" tiene una subsección sobre los tipos de intersección .
Informe de Benjamin C. Pierce (1991), "Programación con tipos de intersección, tipos de unión y polimorfismo"
David P. Cunningham (2005), "Tipos de intersección en la práctica" , que contiene un estudio de caso sobre el lenguaje Forsythe, que se menciona en el artículo de Wikipedia.
Una pregunta de desbordamiento de pila, "Tipos de unión y tipos de intersección" que obtuvo varias buenas respuestas, entre ellas esta que da un ejemplo de pseudocódigo de tipos de intersección similares a los míos anteriores.
T
como interfaz I
cuando implementa todos los métodos de la interfaz, pero no declaró esa interfaz".
T
define un tipo, incluso si solo se define dentro de la declaración de función como "algún tipo que se extiende / implementaIX
yIY
". El hecho de que el valor de retorno real sea un caso especial de eso (A
oB
respectivamente) no es nada especial aquí, también podría lograrlo usando enObject
lugar deT
.