似乎直到最近几年,将额外类型传递给函数的通常方法是执行类似的操作
f (undefined :: T)
Run Code Online (Sandbox Code Playgroud)
Kiselyov和Shan甚至在他们的经典论文中使用了这种方法,该论文基于类的反思,激发了这个reflection
方案.他们通过注意到从未检查过伪造的价值来原谅明显的丑陋.并且出现了一个稍微不那么丑陋的化身Data.Bits.finiteBitSize
,它取了一个它忽略的值来获得它的类型.
然后有人想出代理习语,一切都改变了.现在我们总能看到更令人满意的
f (Proxy :: Proxy T)
Run Code Online (Sandbox Code Playgroud)
(在标准代码-GHC类型的应用程序是另一个故事).
是谁想出来的?这是第一次出现在某个地方的代码还是纸上?
hao*_*hao 21
一个很棒的问题.TypeLevelReasoning,从2013年4月早期GHC建议,引用libraries
线"代理,新的分型和类型层次平等"(原来的海报理查德·艾森伯格,落后于许多近期的相关工作哈斯克尔的驱动力).该线程引用另一个libraries
线程"Proxy and new- typeable "(原始海报Shachaf Ben-Kiki),该线程是为响应new-typeable
分支机构的补丁而启动的.很难找到旧分支名称的记录以及他们指出的提交,但JoséPedroMagalhães提交的3d53407似乎是该分支的压扁版本.事实上,这似乎是GHC首次提出引入data Proxy t = Proxy
类型的提交.艾森伯格后来在2013年2月将这种类型转移到Data.Proxy
了01aa22b的承诺中.最终的设计Proxy
似乎是许多人的想法的集体合成.但是,我们可以Proxy
在Magalhães的作品中找到学术参考,例如他的演讲"正确的通用编程"(2012年10月)和他的博客文章"即将推出的GHC HEAD:poly-kinded Typeable"(2012年11月).我们可以将Proxy
基础包含在他身上.
但是,Proxy
类型的想法似乎更老:
"为Haskell提供促销"由Yorgey,Cretin,SPJ(2011年10月)
正是在这里,我的谷歌搜索变得干涸.我似乎无法找到2005年论文的先行者.
Coda:Shachaf在该线程中的提议,通过使用forall proxy a. proxy a
(基本库至今仍然使用)来普遍量化代理类型而不是forall a. Proxy a
本身很有趣,因为线程中的那些和其他电子邮件表明在某一点上可能有多个Proxy
在Haskell生态系统中漂浮的实例.正如评论中提到的,Kmett标记的图书馆在2010年6月发布了它.