f# - F# 中最接近 Haskell GADT 和类型类的是什么?

标签 f# typeclass gadt

F# 是带有 OOP 的 ML。它与 Haskell 广义代数数据类型和类型类最接近的是什么?

最佳答案

答案取决于您要解决的问题。 F# 没有类型类和 GADT,因此没有直接映射。但是,F# 具有多种机制,您可以使用这些机制来解决您通常使用 GADT 和类型类在 Haskell 中解决的问题:

  • 如果您想表示对象结构并能够添加具有不同行为的新具体实现,那么您通常可以使用标准 OO 和接口(interface)。

  • 如果您想编写通用数字代码,您可以使用静态成员约束 (here is an example),这可能是技术上最接近类型类的机制。

  • 如果您想编写更高级的通用代码(如通用打印机或解析器),那么您通常可以使用 powerful F# runtime reflection能力。

  • 如果您需要通过一组函数(执行代码所需的各种子操作)对代码进行参数化,那么您可以传递一个接口(interface)的实现,如@pad 所示。

    <

还有一种方法可以emulate Haskell type classes in F# ,但这通常不是惯用的 F# 解决方案,因为 F# 编程风格在许多方面与 Haskell 风格不同。一个相当标准的用法是定义重载运算符(参见 this SO answer )。

在元级别,询问什么与另一种语言中的特征 X 等价通常会导致困惑的讨论,因为 X 可能用于解决一种语言中的问题 A、B、C 而另一种语言可能会提供不同的功能来解决相同的问题(或者某些问题可能根本不存在)。

关于f# - F# 中最接近 Haskell GADT 和类型类的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37447313/

相关文章:

list - 递归处理列表和列表的子列表给出类型不匹配

f# - 为什么我在 printfn 尝试打印对象时看到 Program+ 前缀?

haskell - 我想编写一个类似于Haskell中的`flip`的函数来摆脱lambda表达式。但我不能处理它的类型

scala - 为什么 scalac 会在这里出现 "diverging implicit expansion"错误?

haskell - 在 Haskell 中用(广义的)箭头写阶乘

Haskell、GADT 和 -fwarn-incomplete-patterns

asp.net - 在非常基本的 WebSharper 应用程序中找不到 '/Scripts/IntelliFactory.WebSharper.dll.js'

function - 如何在 F# 中定义相互依赖的函数?

haskell - 高阶列表和类型族的歧义错误

ocaml - 异构列表上的这种类型错误是什么意思?