Nota inicial:
Essa questão foi encerrada após várias edições, porque eu não tinha a terminologia adequada para indicar com precisão o que estava procurando. Sam Tobin-Hochstadt postou um comentário que me fez reconhecer exatamente o que era: linguagens de programação que suportam tipos de interseção para valores de retorno de função.
Agora que a pergunta foi reaberta, decidi melhorá-la reescrevendo-a de uma maneira (esperançosamente) mais precisa. Portanto, algumas respostas e comentários abaixo podem não fazer mais sentido, pois se referem a edições anteriores. (Consulte o histórico de edições da pergunta nesses casos.)
Existem linguagens de programação populares de tipo estatístico e fortemente tipado (como Haskell, Java genérico, C #, F # etc.) que suportam tipos de interseção para valores de retorno de função? Se sim, qual e como?
(Se eu for honesto, eu adoraria ver alguém demonstrar uma maneira de expressar tipos de interseção em uma linguagem convencional como C # ou Java.)
Vou dar um exemplo rápido de como os tipos de interseção podem parecer, usando algum pseudocódigo semelhante ao 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();
}
Ou seja, a função fn
retorna uma instância de algum tipo T
, da qual o chamador sabe apenas que implementa interfaces IX
e IY
. (Ou seja, diferentemente dos genéricos, o chamador não escolhe o tipo concreto de T
- a função escolhe . A partir disso, eu suponho que, T
na verdade, não seja um tipo universal, mas existencial.)
PS: Estou ciente de que alguém poderia simplesmente definir ae interface IXY : IX, IY
alterar o tipo de retorno fn
para IXY
. No entanto, isso não é realmente a mesma coisa, porque geralmente você não pode anexar uma interface adicional IXY
a um tipo definido anteriormente A
que apenas implementa IX
e IY
separadamente.
Nota de rodapé: Alguns recursos sobre os tipos de interseção:
O artigo da Wikipedia para "Sistema de tipos" possui uma subseção sobre tipos de interseções .
Relatório de Benjamin C. Pierce (1991), "Programação com tipos de interseção, tipos de união e polimorfismo"
David P. Cunningham (2005), "Tipos de interseção na prática" , que contém um estudo de caso sobre o idioma de Forsythe, mencionado no artigo da Wikipedia.
Uma pergunta sobre estouro de pilha, "Tipos de união e tipos de interseção", que obteve várias boas respostas, entre elas uma que fornece um exemplo em pseudocódigo de tipos de interseção semelhantes aos meus acima.
T
como interface I
quando implementa todos os métodos da interface, mas não declarou essa interface".
T
define um tipo, mesmo que apenas seja definido na declaração da função como "algum tipo que estende / implementaIX
eIY
". O fato de o valor de retorno real ser um caso especial disso (A
ouB
respectivamente) não é nada de especial aqui, você também pode conseguir isso usando emObject
vez deT
.