Eu tenho tentado entender por que o JDK 8 Lambda Expert Group (EG) decidiu não incluir um novo tipo de função na linguagem de programação Java.
Revendo a lista de discussão, encontrei um tópico com a discussão sobre remoção de tipos de função .
Muitas das declarações são ambíguas para mim, talvez devido à falta de contexto e, em alguns casos, devido ao meu conhecimento limitado sobre a implementação de sistemas de tipos.
No entanto, existem algumas perguntas que acredito que posso formular com segurança neste site para me ajudar a entender melhor o que elas significam.
Eu sei que poderia fazer as perguntas na lista de discussão, mas o tópico é antigo e todas as decisões já estão tomadas, então é provável que eu seja ignorado, acima de tudo, vendo que esses caras já estão se atrasando em seus planos.
Em sua resposta para apoiar a remoção de tipos de função e endossar o uso de tipos SAM, Brian Goetz diz:
Sem reificação. Havia um longo tópico sobre o quão útil seria para os tipos de funções serem reificados. Sem reificação, os tipos de função são prejudicados.
Não consegui encontrar o fio que ele menciona. Agora, eu posso entender que a introdução de um tipo de função estrutural pode implicar certas complicações no sistema de tipos principalmente Java, o que não consigo entender é como os tipos SAM parametrizados são diferentes em termos de reificação.
Os dois não estão sujeitos aos mesmos problemas de reificação? Alguém entende como os tipos de função são diferentes dos tipos parametrizados de SAM em termos de reificação?
Em outro comentário, Goetz diz:
Existem duas abordagens básicas para a digitação: nominal e estrutural. A identidade de um nominal é baseada em seu nome; a identidade de um tipo estrutural é baseada no que é composto (como "tupla de int, int" ou "função de int para flutuar".) A maioria das línguas escolhe principalmente nominal ou principalmente estrutural; não há muitos idiomas que combinam com sucesso a tipagem nominal e estrutural, exceto "nas bordas". Java é quase inteiramente nominal (com algumas exceções: matrizes são do tipo estrutural, mas na parte inferior sempre existe um tipo de elemento nominal; os genéricos também têm uma mistura de nominal e estrutural, e isso é de fato parte da fonte de muitos reclamações das pessoas sobre genéricos.) Enxertando um sistema de tipo estrutural (tipos de função) no Java ' s sistema do tipo nominal significa nova complexidade e casos extremos. O benefício dos tipos de função vale isso?
Aqueles de vocês com experiência na implementação de sistemas de tipos. Você conhece algum exemplo dessas complexidades ou casos extremos que ele menciona aqui?
Honestamente, fico confuso com essas alegações quando considero que uma linguagem de programação como Scala, inteiramente baseada na JVM, oferece suporte a tipos estruturais, como funções e tuplas, mesmo com os problemas de reificação da plataforma subjacente.
Não me interpretem mal, não estou dizendo que um tipo de função deve ser melhor que os tipos SAM. Eu só quero entender por que eles tomaram essa decisão.