首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪种语言的泛型是OCaml中类似于C++、Java或C#的泛型类和函数?

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

Stack Overflow用户
提问于 2017-09-20 04:56:13
回答 1查看 734关注 0票数 3

我从C++模板、Java泛型和C#泛型之间学到了区别,这有助于我更好地理解如何以不同的方式正确地使用它们。

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

如果我是对的,在OCaml中,类可以显式参数化多态,而函数隐式参数多态?

为了帮助我学习在OCaml中使用泛型,哪种语言的泛型是OCaml中类似于C++、Java或C#的泛型类和函数?因为OCaml的函数是隐式参数多态的,而不是显式的,而且C++、C#和C#中的泛型函数是显式参数多态的,这一点我说得对吗?

OCaml似乎有第三个泛型:称为函子。如果我是对的,泛型模块与OCaml中的泛型类和函数是不同的。我在这里的问题只是关于类和函数。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-20 14:30:42

Java是最近的。

OCaml类型系统提供参数多态性,这意味着值的类型可以有类型变量(参数),这意味着一个值可以在给定的上下文中有多个类型。与您提到的语言不同,OCaml还具有类型推断。OCaml将根据该值在程序中的使用方式推断出最一般的值类型,也就是说,它将试图找到与该值的用法相匹配的最大类型集。类型推理系统能够导出最一般类型(最大类型集,也称为主体类型)的性质称为公国。OCaml使用了一种基于辛德雷-米尔纳类型系统的类型推理系统,尽管它有很多父亲。首先,OCaml有子类型,类型推断(它试图成为主体),通过从程序员那里得到一些注释形式的帮助(否则,它将推断出不那么一般的类型)。这就是为什么OCaml类具有显式类型参数的原因。如果我们忘记了子类型,那么类、对象、函数甚至函子都可以被认为是相等的。事实上,它们基本上具有相同的运行时表示。在OCaml中,我们对显式和隐式类型变量没有区别。函数的类型也有类型变量,但是由于编译器通常为我们推断类型,所以我们不指定它们。但是,在定义模块接口时,我们总是显式地指定类型变量,例如,考虑提供具有类型Listlength函数的'a list -> int模块。正如您可能看到的,类型变量'a在这里非常显式。

在表示方面,Java表示是实现参数多态的正确方法。由于参数多态性涉及一个值,它有多个类型,而不是具有不同类型的一系列值(不管它们是在运行时还是编译时构造的)。这表明了C#/C++泛型与OCaml/Java泛型的本质区别。在后者中,我们有一个通用的值,而在前者中,我们有一个具有相同接口但可能有不同实现的值工厂,这实际上是特别多向主义的一个例子。因此,在OCaml中,当您有一个多态函数或数据值时,它总是只有一个对象,不管它在哪里应用,例如,在List.length [1;2;3]List.length ["hello"; "world"]中,List.length函数的相同代码被应用到不同的列表中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46313584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档