¿Quién inventó el pase de poder y cuándo?

Parece que hasta los últimos años, la forma habitual de pasar un tipo adicional a una función era hacer algo como

f (undefined :: T)

Kiselyov y Shan incluso utilizaron este enfoque en su artículo clásico sobre la reflexión basada en la clase que inspiró elreflection paquete. Disculparon la fealdad obvia al señalar que el valor falso nunca se inspecciona. Y aparece una encarnación solo un poco menos fea enData.Bits.finiteBitSize, que toma un valor que ignora para obtener su tipo.

Entoncesalguien descubrí el lenguaje proxy, y todo cambió. Ahora siempre vemos lo mucho más satisfactorio

f (Proxy :: Proxy T)

(en código estándar: la aplicación de tipo GHC es otra historia).

¿Quién lo descubrió? ¿Apareció esto por primera vez en algún lugar del código o en un documento?