这个问题是从
SML.NET可以做函子,并与微软.NET一起工作。
\* See: [SML.NET User Guide](http://www.cl.cam.ac.uk/research/tsg/SMLNET/smlnet.pdf) Section 4.8.2 Class types and functors?我一直注意到,由于微软F#的某些限制,.NET无法执行真正的函式。
\* [Can ML functors be fully encoded in .NET (C#/F#)?](https://stackoverflow.com/q/1426239/1243762) \* [Any workaround for functor?](http://cs.hubfs.net/topic/None/57222) 那么,如果SML.NET可以在.NET上做函子,为什么F#不能呢?SML.NET做了F#不能做的事情吗?
我从范畴理论中学到的函子越多,我就越能看到函子的美,也越想在F#中拥有它们。
编辑
为了更好地理解范畴理论和函数式编程之间的关系,请参阅问与答 at 政务司司长:StackExchange。
发布于 2013-02-08 17:09:27
.NET没有阻止函子在F#中实现的基本限制。诚然,它们不能直接用.NET元数据表示,但其他F#语言特性(如联合类型)也不能直接表示。函子语言的编译器(例如,标准ML,OCaml)有一个名为http://mlton.org/Defunctorize的通行证;它的工作方式类似于C++模板扩展,因为它通过将函子专门化为普通模块来“平平”函子。
F#编译器可以做同样的事情,但是接下来您必须问:这将如何向其他.NET语言公开?由于函子不能在.NET类型系统中直接编码,所以您需要想出一些方法来表示它们;如果C#或VB.NET很难/不可能使用这种表示,那么包含F#函子是否仍然有意义呢?F#成功的一个重要部分在于它能够轻松地(在两个方向)与C#和VB.NET进行互操作。
编辑:不要误解我的意思--我希望在F#中有函子,如果没有函子,它们对处理一些目前痛苦和/或不可能实现的情况是非常有用的。我只是指出,语言还没有(也许永远不会)有函子的主要原因是互操作问题尚未解决;元数据编码问题实际上是很容易解决的。
编辑2:MLton:defunctorize.fun失效传递的代码
更新:--我曾经想过如何在.NET类型系统中表达函子,所以我做了一个小实验。它不是很漂亮,但它很管用--所以现在我们知道,至少有一天,F#可以支持函子。实际上,您在我的实验代码中看到的复杂性都会被编译器/语言所隐藏。如果您想要查看它:实验函子
https://stackoverflow.com/questions/14777522
复制相似问题