Il semble que jusqu'à ces dernières années, la façon habituelle de passer un type supplémentaire à une fonction était de faire quelque chose comme
f (undefined :: T)
Kiselyov et Shan ont même utilisé cette approche dans leur article classique sur la réflexion en classe qui a inspiré le reflection
paquet. Ils ont excusé la laideur évidente en faisant remarquer que la fausse valeur n'est jamais inspectée. Et une incarnation à peine moins laide apparaît dans Data.Bits.finiteBitSize
qui prend une valeur qu'il ignore pour obtenir son type.
Puis quelqu'un a découvert l'idiome proxy, et tout a changé. Maintenant, nous voyons toujours la version beaucoup plus satisfaisante
f (Proxy :: Proxy T)
(en code standard - l'application de type GHC est une autre histoire).
Qui a trouvé la solution ? Est-ce que cela est d'abord apparu dans un code quelque part, ou dans un article ?