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

dfe*_*uer 29 haskell types

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

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.Proxy01aa22b的承诺中.最终的设计Proxy似乎是许多人的想法的集体合成.但是,我们可以Proxy在Magalhães的作品中找到学术参考,例如他的演讲"正确的通用编程"(2012年10月)和他的博客文章"即将推出的GHC HEAD:poly-kinded Typeable"(2012年11月).我们可以将Proxy基础包含在他身上.

但是,Proxy类型的想法似乎更老:

正是在这里,我的谷歌搜索变得干涸.我似乎无法找到2005年论文的先行者.

Coda:Shachaf在该线程中的提议,通过使用forall proxy a. proxy a(基本库至今仍然使用)来普遍量化代理类型而不是forall a. Proxy a本身很有趣,因为线程中的那些和其他电子邮件表明在某一点上可能有多个Proxy在Haskell生态系统中漂浮的实例.正如评论中提到的,Kmett标记的图书馆在2010年6月发布了它.

  • *很棒*研究! (4认同)
  • 当库的用户可能已经拥有某些`f`的`fa`时,通用量化代理是很有用的.例如`datatypeName :: Datatype d => td(f ::* - >*)a - > [Char]`[from Generics](https://hackage.haskell.org/package/base/docs/GHC- Generics.html #t:Datatype)是一个有趣的`数据类型d =>代理d - > [Char]`,这对于持有通用表示的`M1 D dfp`元节点的人来说很方便. (2认同)