OCaml中的模块和类

OCaml中的模块和类,ocaml,Ocaml,OCaml中模块和类之间的区别是什么 通过我的搜索,我发现: 它们都提供了抽象和封装机制,例如 子类型(通过在对象中省略方法,在 对于继承(对象使用继承;模块使用 包括)。但是,这两个系统不具有可比性。 一方面,对象有一个优势:对象是第一类的 值,而模块不支持。换句话说,模块不支持 动态查找。另一方面,模块有一个优势:模块 可以包含类型定义,而对象不能 首先,我不明白“模块不支持动态查找”是什么意思。在我看来,抽象和多态性确实意味着父指针可以引用子实例。这就是“动态查找”吗?如果不是,动态查找实

OCaml中模块和类之间的区别是什么

通过我的搜索,我发现:

它们都提供了抽象和封装机制,例如 子类型(通过在对象中省略方法,在 对于继承(对象使用继承;模块使用 包括)。但是,这两个系统不具有可比性。 一方面,对象有一个优势:对象是第一类的 值,而模块不支持。换句话说,模块不支持 动态查找。另一方面,模块有一个优势:模块 可以包含类型定义,而对象不能

首先,我不明白“模块不支持动态查找”是什么意思。在我看来,抽象和多态性确实意味着父指针可以引用子实例。这就是“动态查找”吗?如果不是,动态查找实际上意味着什么


实际上,我们什么时候选择使用模块,什么时候选择使用类?

模块和类之间的主要区别在于您没有实例化模块

模块基本上只是一个“抽屉”,您可以在其中放置类型、函数、其他模块等。。。它只是在这里订购您的代码。不过,多亏了函子,这个抽屉真的很强大

另一方面,存在一个要实例化的类。它们包含变量和方法。可以从类创建对象,每个对象都包含自己的变量和方法(如类中定义的)


实际上,大多数情况下,使用模块将是一个很好的解决方案。当您需要继承时,类可能很有用(例如小部件)。

从实用的角度来看,动态查找允许您使用相同的方法拥有不同的对象,而无需指定它属于哪个类/模块。它在使用继承时帮助您

例如,让我们使用两个数据结构:
SingleList
DoubleLinkedList
,这两个数据结构都继承自
List
,并具有方法
pop
。每个类都有自己的方法实现(因为“重写”)

因此,当您想要调用它时,当您执行
列表#pop
时,将在运行时(也称为动态)查找该方法

如果您使用的是模块,则必须使用
SingleList.pop list
DoubleLinkedList.pop list

编辑:正如@Majestic12所说,大多数时候,OCaml用户倾向于使用模块而不是类。在需要继承或实例时使用第二个(检查他的答案)

我想让这个描述变得实用,因为您对OCaml来说是新手

希望它能帮助你