gpt4 book ai didi

f# - 如果 SML.NET 有仿函数,为什么 F# 不能?

转载 作者:行者123 更新时间:2023-12-03 07:50:50 27 4
gpt4 key购买 nike

这个问题从

  • 我将 L. C. PAULSON 的“ML for the Working Programmer”(WorldCat)翻译成 F#,它使用仿函数作为示例。
  • 最终希望翻译“Purely Functional Data Structures”(WorldCat)由 Chris Okasaki 使用仿函数。
  • 阅读 Andrea Asperti 和 Giuseppe Longo 的“CATEGORIES TYPES AND STRUCTURES - An Introduction to Category Theory for the working computer scientist”(WorldCat)。
  • 不明白,主要是范畴论。

  • 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 at CS:StackExchange

    最佳答案

    .NET 没有阻止仿函数在 F# 中实现的基本限制。诚然,它们不能直接在 .NET 元数据中表示,但其他 F# 语言功能(如联合类型)也不能。带有仿函数的语言(例如,标准 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

    关于f# - 如果 SML.NET 有仿函数,为什么 F# 不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14777522/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com