generics - 哪种语言的泛型是 OCaml 中类似于 C++、Java 或 C# 的泛型类和函​​数?

标签 generics ocaml programming-languages computer-science

我从 https://stackoverflow.com/a/31876747/3284469 了解了 C++ 模板、Java 泛型和 C# 泛型之间的区别,这有助于我更好地理解如何以不同的方式正确使用它们。

OCaml 中的

也可以有类型参数,参见 https://realworldocaml.org/v1/en/html/classes.html 中的“类参数和多态性” .

如果我是正确的,在 OCaml 中,虽然类可以显式参数化多态性,但函数隐式参数化多态性?

为了帮助我学习在 OCaml 中使用泛型,哪种语言的泛型是 OCaml 中类似于 C++、Java 或 C# 的泛型类和函​​数?我是否正确认为,因为 OCaml 的函数是隐式参数多态而不是显式的,而 C++、Java 和 C# 中的通用函数是显式参数多态的,它们根本不相似?

OCaml 似乎有第三个泛型:generic modules called functors .如果我是正确的,泛型模块不同于 OCaml 中的泛型类和函​​数。我这里的问题只是关于类和函数。

谢谢。

最佳答案

长话短说; Java 是最接近的。

OCaml 类型系统提供 parametric polymorphism ,这意味着一种类型的值可以有类型变量(参数),这意味着一个值在给定的上下文中可以有多种类型。与您提到的语言不同,OCaml 还具有类型推断。 OCaml 将根据值在程序中的使用方式推断出最通用的值类型,即,它将尝试找到与值的用法相匹配的最大类型集。类型推理系统能够派生出最通用的类​​型(最大的类型集——也称为主体类型)的属性称为主体性。 OCaml 使用基于 Hindley-Milner 的类型推断系统类型系统,虽然它去了很多父亲。首先,OCaml 有子类型,类型推断(试图成为主体)带有子类型 requires程序员以注释形式提供的一些帮助(否则它会推断出不太通用的类型)。这就是 OCaml 类具有显式类型参数的原因。如果我们忘记子类型化,那么类、对象、函数甚至仿函数都可以被认为是相等的。事实上,它们基本上具有相同的运行时表示。在 OCaml 中,我们不区分显式和隐式类型变量。一种类型的函数也有类型变量,但由于编译器通常会为我们推断类型,所以我们不指定它们。但是,当我们定义模块接口(interface)时,我们总是明确指定类型变量,例如,考虑提供 length 函数的 List 模块,其类型为 'a list -> 整数。如您所见,类型变量 'a 在这里非常明确。

关于表示,Java 表示是实现参数多态性的正确方式。正如参数多态性所说的那样,一个值具有多种类型,而不是具有不同类型的一系列值(它们是在运行时还是在编译时构造的并不重要)。这显示了 C#/C++ 泛型和 OCaml/Java 泛型之间的本质区别。在后者中,我们有一个通用的值,而在前者中,我们有一个具有相同接口(interface)但可能有不同实现的值工厂,这实际上是 ad hoc polymophism 的一个例子。 .所以,在 OCaml 中,当你有一个多态函数或一个数据值时,它总是只有一个对象,无论它应用在哪里,例如,在 List.length [1;2;3] 中和 List.length ["hello"; "world"] List.length 函数的相同代码应用于不同的列表。

关于generics - 哪种语言的泛型是 OCaml 中类似于 C++、Java 或 C# 的泛型类和函​​数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46313584/

相关文章:

emacs - 为什么 emacs Tuareg 模式为 Ocaml 中的函数显示不同的颜色?

ocaml - 从位置到元素的函数转换

functional-programming - 已安装 ocamlfind (findlib),但在 Mac 中始终找不到任何额外的包

parsing - Shift-Reduce 和Reduce-Reduce 示例以及一个已解决的示例?

programming-languages - 登月使用了哪些编程语言?

java - 将通用类型传递到indexOf方法JAVA

java - 在Java中创建泛型类型的实例?

programming-languages - 弱公平和强公平有什么区别?

java - 通过反射创建泛型类的实例

java - 馆藏 map