谁发明了代理传递和什么时候?

时间:2016-05-16 19:19:25

标签: haskell types

似乎直到最近几年,将额外类型传递给函数的常用方法是执行类似

的操作
f (undefined :: T)

Kiselyov和Shan甚至在他们关于基于类的反思的经典论文中使用了这种方法,它启发了reflection包。他们通过注意到从未检查过伪造的价值来原谅明显的丑陋。在Data.Bits.finiteBitSize中出现了一个稍微不那么丑陋的化身,它取了一个它忽略的值来获得它的类型。

然后某人想出了代理习惯用法,一切都改变了。现在我们总能看到更令人满意的

f (Proxy :: Proxy T)

(在标准代码-GHC类型的应用程序中是另一个故事)。

谁想出来了?这是第一次出现在代码中的某个地方还是纸上?

1 个答案:

答案 0 :(得分:21)

梦幻般的问题。 TypeLevelReasoning是2013年4月的早期GHC提案,引用了libraries主题"Proxy, new Typeable, and type-level equality"(原始海报Richard Eisenberg,这是近期许多Haskell工作背后的驱动力)。该线程引用另一个libraries线程"Proxy and new-typeable"(原始海报Shachaf Ben-Kiki),该线程是为响应来自new-typeable分支的补丁而启动的。很难找到旧分支名称的记录以及他们指出的提交,但commit 3d53407 by José Pedro Magalhães似乎是该分支的压扁版本。实际上,它似乎是GHC中第一次引入data Proxy t = Proxy类型的提交。艾森伯格后来在2013年2月将此类型移至commit 01aa22b Data.ProxyProxy的最终设计似乎是许多人的想法的集体综合。但是,我们可以在Magalhães的作品中找到Proxy的学术参考资料,例如他的演讲"The right Kind of Generic Programming"(2012年10月)和他的博客文章"Coming soon in GHC HEAD: poly-kinded Typeable"(2012年11月)。我们可以将Proxy包含在他的基础中。

然而,Proxy类型的想法似乎更老了:

在这里,我的谷歌搜索变得干涸。我似乎无法找到2005年论文的前提。

Coda:Shachaf在该主题中的提议,通过使用forall proxy a. proxy a(基本库至今仍然使用)代替forall a. Proxy a来普遍量化代理类型本身很有趣,因为它和其他线程中的电子邮件表明,在某一点上可能有多个Proxy实例在Haskell生态系统中浮动。正如评论中所提到的,Kmett's tagged library had it back in June 2010