【问题标题】:If SML.NET had functors why can't F#?如果 SML.NET 有函子,为什么 F# 不能?
【发布时间】:2013-01-24 12:16:10
【问题描述】:

这个问题从

开始
  1. 我将 L. C. PAULSON 的 "ML for the Working Programmer" (WorldCat) 翻译成 F#,其中使用函子作为示例。
  2. 最终希望翻译 Chris Okasaki 使用函子的“Purely Functional Data Structures”(WorldCat)。
  3. 阅读 Andrea Asperti 和 Giuseppe Longo 的“CATEGORIES TYPES AND STRUCTURES - An Introduction to Category Theory for the working computer scientist” (WorldCat)。
  4. 没有完全理解,主要是范畴论。

SML.NET 可以做仿函数并使用 Microsoft .NET。
* 参见:SML.NET User Guide Section 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&ACS:StackExchange

【问题讨论】:

标签: f# ocaml sml functor ml


【解决方案1】:

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

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

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

编辑 2:MLtondefunctorize 传递代码:defunctorize.fun

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

【讨论】:

  • +1 - 您可能会在互操作方面一针见血。知道 SML.NET 中的函子如何出现在其他 .NET 语言中吗?
  • @GuyCoder:谢谢,但我没有看到任何关于仿函数在 CIL 中的表示方式。根据 Jack 所说,我是否应该假设函子被“解函数化”为几个标准模块并因此出现在其他 .NET 语言中?
  • 据我所知:OCaml 不使用解函数器。函子在内部实现为从记录到记录的映射。在一个由另一个模块 B 参数化的模块 A 中,从 B 中引用一个值实际上就像获取一个记录字段一样。函数值也是如此,这意味着从 B 对函数的任何调用都是通过闭包进行的,没有内联或其他优化。因此,解解函数的代码可能会更快。
  • @JackP。 “这将如何暴露给其他 .NET 语言?”。度量单位的暴露方式相同,即不暴露它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
相关资源
最近更新 更多