这个问题从开始出
- 我的“的翻译ML的工作程序员 ”( WorldCat中由LC保尔森F#),它采用仿函数的例子。
- 最终愿望翻译“ 纯功能数据结构 ”( WorldCat中 )由克里斯·奥卡萨基它采用仿函数。
- 读“ 类别的类型和结构-介绍范畴理论为工作计算机科学家 ”( WorldCat的安德烈Asperti和Giuseppe Longo的)。
- 不理解这一切,大多范畴论。
SML.NET可以做函子和与微软.NET工作。
*请参阅: SML.NET用户指南第4.8.2类类型和函子?
我不断看到的是F#不能这样做,因为在微软.NET一些限制的真正函子。
* 可ML仿函数在.NET(C#/ F#)完全编码?
* 任何解决方法函子?
所以,如果SML.NET可以做.NET函数子,那么为什么不能F#? 什么SML.NET做F#不能?
我越了解仿函数从范畴论的到来,更多的我看到他们的美丽和欲望,让他们在F#。
编辑
在追求更好的理解范畴论和函数式编程之间的关系看,这些Q&A在CS回答# 。
还有,从在F#正在实施停止函子.NET的没有根本性的限制。 诚然,他们不能直接在.NET中的元数据来表示,但也可以在其他F#语言功能,如联合类型。 编译器与仿函数(例如,标准ML,OCaml的)都称为一个合格的语言defunctorize ; 它的工作原理就像C ++模板扩张,它由专门它们变成正常的模块“变平”的函子。
F#编译器可以做同样的事情,但你必须要问:怎么可能暴露给其他.NET语言? 由于仿函数不能直接在.NET类型系统编码,你需要想出一些办法来代表他们。 如果这表示是难以/不可能从C#或VB.NET使用,将它仍然是有意义的包括F#仿函数? F#是成功的一个不平凡的一部分来自于它的能力,轻松地互操作(双向)与C#和VB.NET。
编辑:请不要误会我的意思 - 我喜欢在F#函子,他们会非常有用处理少数情况下这是目前疼痛和/或不可能没有他们来实现。 我只是指出,最主要的原因语言尚不(也许永远不会)有仿函数是互操作问题还没有得到解决; 元数据编码的问题实际上是比较容易的部分。
编辑2:代码的defunctorize通MLton : defunctorize.fun
更新:我有一个关于如何函子实际上可以在.NET类型系统中表达的思想,所以我把一个小实验。 它是不是很漂亮,但它的工作原理 - 所以现在我们知道这是至少合理的,F#有朝一日支持函子。 在实践中,你在我的实验代码中看到的复杂性将全部由编译器/语言隐藏。 如果你想看看: 实验-函子