【问题标题】:Do type providers exist in other languages except F#?类型提供程序是否存在于除 F# 之外的其他语言中?
【发布时间】:2019-05-17 05:07:54
【问题描述】:

我已经坚持了几天了...对不起这样的问题,但我只是 F# 本身的初学者。由于有很多关于类型提供程序的讨论,我决定构建一个并写一篇关于它的论文。当我开始时,我不知道提供者是什么类型。现在我有了一些想法,并且我已经构建了一个简单的 CSV 类型提供程序,但是我在评估中缺乏关于用其他语言制作这样的东西需要多少时间和工作的论据。到目前为止,我还没有找到任何线索,只是类型提供程序是 F# 3.0 中的一个特性。谁能帮帮我好吗?

【问题讨论】:

  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。避免一次问多个不同的问题。请参阅How to Ask 页面以获得澄清此问题的帮助。
  • 许多语言都有类似的功能。例如,Lisp 中的宏和 GHC 的 TemplateHaskell 扩展。通常,此类事情属于“元编程”的概念。用它来谷歌。
  • 谢谢,@FyodorSoikin!我会立即尝试搜索它。
  • 请记住,其他语言的元编程工具与 F# 类型的提供程序并不完全相同。有些会更灵活,有些则不那么灵活;一些更一般,一些更少。因此,在其他语言中实现您可以使用类型提供程序执行的操作可能不是一个公平的比较。
  • 嗯,这个想法是,我必须将它与某些东西进行比较,即使它可能不是一个公平的比较。只是为了表明我并没有仅仅通过实现作为 F# 一部分的类型提供程序而停止。这将是一个很好的方式来表明我找到了一些类似的方法并且可以解释主要概念。这真的很有帮助@FyodorSoikin,因为我什至不知道如何搜索相关的东西。虽然我在 Lisp 中遇到过宏,但我不确定。

标签: f# type-providers


【解决方案1】:

据我所知,唯一直接实现类型提供程序的其他语言是 Idris。请参阅Idris documentation on type providers。有一些例子,包括SQL type provider in David Christiansen's GitHub repo。作为一种依赖类型的语言,类型提供程序的外观与 F# 中的完全不同——它们基本上是使用 %provide 命令调用的 IO monad 中的计算——因此它们与语言的其余部分相比更加统一F# 设计。

还有其他与类型提供程序相关的语言功能。

  • 这包括各种模板系统(例如用于 OCaml 的 Template Haskell 和 camplp4)。这些缺少一些类型提供程序功能(它们实际上生成代码,因此您无法提供“无限大小”类型,并且它们没有与工具集成)。

  • 有很多针对 Java 和 C# 等语言的代码生成工具(LINQ to SQL 使用代码生成,各种 UI 框架也这样做),但同样缺乏语言集成,只能支持以下类型相对较小。

  • 另一个相关的事情是元编程,例如multi-stage programming,但据我所知,这主要是学术性的,没有可靠的语言来实现它。

很难说其中哪些与类型提供者很接近。对我来说,类型提供程序的基本特性是我作为开发人员在使用它们时得到的快速反馈(对于某些人来说,这意味着在开发过程中即时更新模式)——而这是代码生成工具通常不会做的事情。另一个 - 能够懒惰地提供无限数量的类型对某些类型提供者很有用,但并非对所有类型提供者都有用 - 例如JSON、XML 或 CSV 可以由代码生成工具合理处理。

【讨论】:

  • 在事实发生近一年后阅读这篇文章......很好,周到的答案,托马斯。但是,我会说类型提供者对于一般情况可能比通常理解的更有用(就像类型提供者一样“常见”)。例如,由于类型提供程序直接连接到开发环境,因此困扰开发人员的大多数缺点都在 IDE 中得到了神奇的处理——对 JSON 文件所做的更改会在 IDE 中自动实现,无需额外的代码生成步骤,加上免费的增量编译。这是一个强大的开发体验改进。
猜你喜欢
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多