J'ai essayé de comprendre pourquoi le JDK 8 Lambda Expert Group (EG) a décidé de ne pas inclure un nouveau type de fonction dans le langage de programmation Java.
En parcourant la liste de diffusion, j'ai trouvé un fil avec la discussion sur la suppression des types de fonctions .
Beaucoup de déclarations sont ambiguës pour moi, peut-être en raison du manque de contexte et dans certains cas en raison de ma connaissance limitée de la mise en œuvre des systèmes de type.
Cependant, il y a quelques questions que je crois pouvoir formuler en toute sécurité dans ce site pour m'aider à mieux comprendre ce qu'elles signifiaient.
Je sais que je pourrais poser les questions dans la liste de diffusion, mais le fil est ancien et toutes les décisions sont déjà prises, donc il y a des chances que je sois ignoré, surtout vu que ces gars sont déjà en retard avec leurs plans.
Dans sa réponse pour soutenir la suppression des types de fonctions et approuver l'utilisation des types SAM, Brian Goetz dit:
Pas de réification. Il y avait un long fil sur l'utilité de réifier les types de fonctions. Sans réification, les types de fonction sont entravés.
Je n'ai pas pu trouver le fil qu'il mentionne. Maintenant, je peux comprendre que l'introduction d'un type de fonction structurelle peut impliquer certaines complications dans le système de type Java principalement nominal, ce que je ne peux pas comprendre, c'est comment les types SAM paramétrés sont différents en termes de réification.
Ne sont-ils pas tous les deux soumis aux mêmes problèmes de réification? Est-ce que quelqu'un comprend en quoi les types de fonctions sont différents des types SAM paramétrés en termes de réification?
Dans un autre commentaire, Goetz dit:
Il existe deux approches de base du typage: nominal et structurel. L'identité d'un nominal est basée sur son nom; l'identité d'un type structurel est basée sur ce qui le compose (comme «tuple d'int, int» ou «fonction d'int à flottant».) La plupart des langues choisissent principalement nominale ou principalement structurelle; il n'y a pas beaucoup de langues qui mélangent avec succès le typage nominal et structurel, sauf "autour des bords". Java est presque entièrement nominal (à quelques exceptions près: les tableaux sont un type structurel, mais en bas, il y a toujours un type d'élément nominal; les génériques ont également un mélange de nominal et structurel, et cela fait en fait partie de la source de nombreux des plaintes des gens sur les génériques.) Greffage d'un système de type structurel (types de fonctions) sur Java ' Le système de type nominal signifie de nouveaux cas de complexité et de bord. Les avantages des types de fonction en valent-ils la peine?
Ceux d'entre vous ayant une expérience dans la mise en œuvre de systèmes de type. Connaissez-vous des exemples de ces complexités ou cas marginaux qu'il mentionne ici?
Honnêtement, je suis confus par ces allégations quand je considère qu'un langage de programmation comme Scala, qui est entièrement basé sur la JVM, prend en charge les types structurels comme les fonctions et les tuples, même avec les problèmes de réification de la plate-forme sous-jacente.
Ne vous méprenez pas, je ne dis pas qu'un type de fonction devrait être meilleur que les types SAM. Je veux juste comprendre pourquoi ils ont pris cette décision.