Haskell 谁发明了代理传递,何时发明?

Haskell 谁发明了代理传递,何时发明?,haskell,types,Haskell,Types,似乎直到最近几年,向函数传递额外类型的通常方法是执行以下操作 f (undefined :: T) Kiselyov和Shan甚至在他们关于基于类的反射的经典论文中使用了这种方法,这篇论文启发了反射包。他们为明显的丑陋辩解,指出伪造的价值从未被检查过。在Data.Bits.finiteBitSize中出现了一个稍微不那么难看的化身,它接受一个它忽略的值来获得它的类型 后来有人想出了代理习语,一切都变了。现在我们总是看到更令人满意的结果 f (Proxy :: Proxy T) (在标准代码中

似乎直到最近几年,向函数传递额外类型的通常方法是执行以下操作

f (undefined :: T)
Kiselyov和Shan甚至在他们关于基于类的反射的经典论文中使用了这种方法,这篇论文启发了
反射
包。他们为明显的丑陋辩解,指出伪造的价值从未被检查过。在
Data.Bits.finiteBitSize
中出现了一个稍微不那么难看的化身,它接受一个它忽略的值来获得它的类型

后来有人想出了代理习语,一切都变了。现在我们总是看到更令人满意的结果

f (Proxy :: Proxy T)
(在标准代码中,GHC类型应用是另一回事)

是谁弄明白的?这是在某个地方的代码中,还是在一篇论文中首次出现的?

一个奇妙的问题,2013年4月的早期GHC提案引用了
线程(原始海报Richard Eisenberg,许多最近独立的Haskell作品背后的驱动力)。该线程引用了另一个
线程(原始海报Shachaf Ben Kiki),该线程是响应
新的typeable
分支的补丁而启动的。很难找到旧分支名称的记录以及它们指向的提交,但似乎是该分支的压缩版本。实际上,它似乎是GHC中第一个引入
数据代理t=Proxy
类型的提交登录。艾森伯格后来在2013年2月将该类型移动到
Data.Proxy
Proxy
的最终设计似乎是许多人的想法的集体合成。然而,我们可以在Magalhães的作品中找到关于代理的学术参考,例如他的演讲(2012年10月)和他的博客文章(2012年11月)。我们可能会将
Proxy
包含在base中归因于他

但是,
代理
类型的概念似乎更为古老:

  • Yorgey,Cretin,SPJ(2011年10月)

  • 琼斯·拉梅尔(ICFP 2005)

正是在这里,我的谷歌搜索结果干涸了。我似乎找不到2005年那篇论文的先例


Coda:Shachaf在该线程中的建议,即通过对所有代理a使用
来普遍量化代理类型。代理a
(基本库至今仍在使用)而不是所有a的
。代理a本身就很有趣,因为线程中的这封邮件和其他电子邮件表明,在Haskell生态系统中可能有多个
Proxy
实例。正如评论中提到的,.

我第一次在Edward的包fwiw中看到代理。它不是在0.0中,而是在0.1中。这是一个有趣的问题。在其他新闻中,我刚刚看到了历史标签上的一句话:“不要用这个标签来回答有关编程概念或功能历史的问题;这些问题都是离题的。”。有时,这样的政策令人惊讶。(是的,这个评论在这里也有点夸张)。很棒的研究!当库的用户可能已经拥有一些
f
f a
时,通用量化代理非常有用。例如,
datatypeName::datatyped=>td(f::*->*)a->[Char]
是一种有趣的
datatyped=>proxy d->[Char]
,对于持有泛型表示的
M1 d dfp
元节点的人来说很方便。有趣的是,拉梅尔和琼斯将他们的技术描述为标准。同样有趣的是,它绝对不是现代代理技术。他们的
代理a
无人居住,原因不明,似乎并不明智。了解为什么Lammel和Jones在这一点上是错误的,以及为什么现代的
代理是正确的。@Cirdec,有时也可以方便地将singleton作为代理传递。