Кажется, что до недавних лет обычный способ передать дополнительный тип функции состоял в том, чтобы сделать что-то вроде
f (undefined :: T)
Киселев и Шан даже использовали этот подход в своей классической статье о классовом отражении, вдохновившем пакет reflection
. Они оправдали очевидное уродство, отметив, что фиктивная ценность никогда не проверяется. И только немного менее уродливое воплощение появляется в Data.Bits.finiteBitSize
, которое принимает значение, которое оно игнорирует, чтобы получить его тип.
Затем кто-то выяснил прокси-идиому, и все изменилось. Теперь мы всегда видим гораздо более удовлетворительные
f (Proxy :: Proxy T)
(в стандартном коде - приложение типа GHC - это еще одна история).
Кто это понял? Это впервые появилось в коде где-нибудь или в бумаге?