gpt4 book ai didi

OCaml 中的多态性 - ad hoc、参数、包含/子类型

转载 作者:行者123 更新时间:2023-12-04 21:56:34 26 4
gpt4 key购买 nike

我在理解不同类型的多态性时遇到问题,特别是关于 OCaml。我知道多态性允许在 OCaml 中表示为 'a 的多种类型,但我不明白不同类型的多态性是什么。
如果有人可以用相对低级的语言给我一个解释,那就太棒了!
ad hoc、参数化、包含/子类型化

最佳答案

这是一个近似值。

Ad-hoc 多态性通常是指能够以不同的类型声明相同的名称(通常是函数),例如+ : int -> int -> int+ : float -> float -> float在 SML 中。这些是不同的函数,它们的行为方式完全不同,但编译器或解释器会根据上下文选择合适的函数。我想不出 OCaml 中的任何临时多态性实例。然而,它在 C++ 和 Java 中很常见。

参数多态性是指单个函数可以处理任何类型的参数,因为它不尝试查看该参数的结构。例如,cons : 'a -> 'a list -> 'a list能够添加一个值 v任何类型的值到相同类型的值列表,因为它与 cons 无关v 的结构(布局)是什么?是,或者它支持什么操作。在 C 语言中,cons不需要“取消引用”指针,或对 v 执行任何操作特定于 v 的实际类型.请注意,与临时多态性不同,cons必须对所有类型采取相同的方式。因此,参数多态性和临时多态性在某种程度上是彼此天然的“对立面”。参数多态性是 OCaml 中绝大多数多态性实例的原因。

子类型多态性是指您可以使用 t 类型的值。其中 u 类型的值预计。这可能是因为类型 t支持 u 类型的所有操作,或者因为 t的结构可用于u是期待。这方面的例子是子类化(也许在任何车辆可以使用的地方都可以使用总线),或多态变体(您可以使用 'A | 'B,其中应该是 'A | 'B | 'C)。

编辑每条评论

但是请注意,必须在 OCaml 中明确请求子类型。例如,如果您有一个函数 f : u -> int ,并且您想将其应用于 v : t在哪里 tu 的子类型,你必须写f (v :> u) . (v :> u)语法是类型强制。

OCaml 还支持行多态,这是一种带约束的参数多态。如果 f而是 f : #u -> int (对于对象类型)或 f : [< u] -> int (对于多态变体),#u/[< u]语法表示类型变量,类似于'a , 但只能用 u 的相应“子类型”替换(在有限的意义上,它们可以分别支持更多的字段/更少的构造函数)。然后,你可以做 f v没有强制。 OCaml 会自动为许多涉及多态变体和对象的表达式推断使用行多态性的类型,但如果要创建签名,则必须显式编写类型。

行多态性有更多的用法和考虑。我忽略了实际的行变量和附加语法,只描述了一些看起来像有界量化的东西(如在 Java 泛型中)。对行多态性、它的名称和/或其形式的更详细和准确的讨论可能最好留给单独的问题。

关于OCaml 中的多态性 - ad hoc、参数、包含/子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33227667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com