38

这个问题从

  1. 我将LC PAULSON 的“ ML for the Working Programmer ”(WorldCat )翻译成 F#,它使用函子作为示例。
  2. 最终希望翻译 Chris Okasaki 使用函子的“纯功能数据结构”(WorldCat)。
  3. 阅读Andrea Asperti 和 Giuseppe Longo 的“类别类型和结构 - 工作计算机科学家的类别理论简介”(WorldCat )。
  4. 不明白这一切,主要是范畴论。

SML.NET可以做仿函数并与 Microsoft .NET 一起使用。
* 请参阅:SML.NET 用户指南第 4.8.2 节类类型和仿函数?

由于 Microsoft .NET 中的一些限制,我一直看到 F# 无法执行真正的函子。
* ML 仿函数可以在 .NET (C#/F#) 中完全编码吗?
*函子的任何解决方法?

因此,如果 SML.NET 可以在 .NET 上执行仿函数,那么为什么 F# 不能呢?SML.NET 做了哪些 F# 做不到的事情?

我从范畴论中了解的函子越多,我就越能看到它们的美妙之处,并希望在 F# 中使用它们。

编辑

为了更好地理解类别理论和函数式编程之间的关系,请参阅CS:StackExchange上的这些问答

4

1 回答 1

41

.NET 没有阻止函子在 F# 中实现的基本限制。诚然,它们不能直接在 .NET 元数据中表示,但其他 F# 语言功能(如联合类型)也不能。带有仿函数的语言(例如,标准 ML、OCaml)的编译器有一个称为defunctorize的过程;它就像 C++ 模板扩展一样工作,因为它通过将仿函数专门化为普通模块来“扁平化”它们。

F# 编译器可以做同样的事情,但你不得不问:这将如何暴露给其他 .NET 语言?由于函子不能直接在 .NET 类型系统中编码,因此您需要想出一些方法来表示它们;如果这种表示很难/不可能从 C# 或 VB.NET 中使用,那么包含 F# 函子是否仍然有意义?F# 成功的一个重要部分来自于它能够轻松地与 C# 和 VB.NET 互操作(双向)。

编辑:不要误会我的意思——我很想在 F# 中使用仿函数,它们对于处理一些目前很痛苦和/或没有它们就无法实现的情况非常有用。我只是指出该语言还没有(也许永远不会)有函子的主要原因是互操作问题没有得到解决。元数据编码问题实际上是容易的部分。

编辑 2:MLton的解函数传递代码defunctorize.fun

更新:我想到了如何在 .NET 类型系统中实际表达函子所以我做了一个小实验。它不漂亮,但它有效——所以现在我们知道 F# 有朝一日可以支持函子至少是合理的。实际上,您在我的实验代码中看到的复杂性都将被编译器/语言隐藏。如果你想检查一下:experimental-functors

于 2013-02-08T17:09:27.917 回答