此问题始于
SML.NET可以做仿函数并使用Microsoft .NET *请参阅:SML.NET User Guide第4.8.2节类类型和仿函数?
由于Microsoft .NET存在一些限制,我一直认为F#无法做真正的仿函数
* Can ML functors be fully encoded in .NET (C#/F#)?
* Any workaround for functor?
因此,如果SML.NET可以在.NET上运行仿函数,那为什么F#不能呢? SML.NET做了什么,F#不能做什么?
我越了解来自类别理论的仿函数,我越看到它们的美丽,并希望在F#中使用它们。
修改
为了更好地理解类别理论和函数式编程之间的关系,请参阅Q&A上的这些CS:StackExchange。
答案 0 :(得分:40)
.NET的基本限制没有阻止仿函数在F#中实现。确实,它们不能直接在.NET元数据中表示,但其他F#语言功能也不能像union类型那样。带有仿函数的语言编译器(例如,标准ML,OCaml)有一个名为 defunctorize 的传递;它就像C ++模板扩展一样工作,因为它通过将仿函数专门化为普通模块来“展平”仿函数。
F#编译器可以做同样的事情,但你必须问:这将如何暴露给其他.NET语言?由于仿函数不能在.NET类型系统中直接编码,因此您需要提出一些方法来表示它们;如果从C#或VB.NET中难以/不可能使用该表示,那么包含F#仿函数是否仍然有意义? F#成功的一个重要部分来自于它能够与C#和VB.NET轻松互动(双向)。
编辑:不要误会我的意思 - 我喜欢在F#中使用仿函数,它们对于处理一些目前很痛苦和/或无法实现的情况非常有用。我只是指出语言还没有(也许永远不会)有问题的主要原因是互操作问题还没有解决;元数据编码问题实际上很容易。编辑2:MLton defunctorize 的代码:defunctorize.fun
更新:我曾考虑过如何在.NET类型系统中实现可以表达的仿函数,所以我整理了一个小实验。它不漂亮,但它有效 - 所以现在我们知道F#有一天可以支持仿函数至少是合理的。实际上,您在实验代码中看到的复杂性都将被编译器/语言隐藏。如果您想查看它:experimental-functors