我在理解不同类型的多态性时遇到问题,特别是关于 OCaml 的多态性。我知道多态性允许 OCaml 中表示为 'a 的多种类型,但我不明白不同类型的多态性是什么。
如果有人能用相对低级的语言给我解释那就太棒了!
临时、参数、包含/子类型
这是一个近似值。
即席多态性通常是指能够声明具有不同类型的相同名称(通常是函数),例如+ : int -> int -> int
and + : float -> float -> float
在 SML 中。这些是不同的函数,并且它们可以以完全不同的方式起作用,但是编译器或解释器根据上下文选择合适的函数。我想不出 OCaml 中有任何临时多态性的实例。然而,它在 C++ 和 Java 中很常见。
参数多态性是指单个函数可以使用任何类型的参数,因为不尝试查看该参数的结构。例如,cons : 'a -> 'a list -> 'a list
能够预先添加一个值v
任何类型到相同类型的值列表,因为这并不重要cons
的结构(布局)是什么v
是什么,或者它支持什么操作。用C语言来说,cons
不需要“取消引用”指针,或执行任何操作v
这是特定于实际类型的v
。请注意,与临时多态性不同,cons
has对所有类型都采取相同的方式。因此,参数多态性和临时多态性在某种程度上是彼此天然的“对立面”。 OCaml 中绝大多数多态性实例都是由参数多态性造成的。
子类型多态性是指您可以使用类型值t
其中类型值u
预计。这可能是因为类型t
支持类型的所有操作u
,或者因为t
的结构可以用在哪里u
是期待。这样的例子是子类化(也许总线可以在任何车辆可以使用的地方使用)或多态变体(您可以使用'A | 'B
where 'A | 'B | 'C
是期待)。
编辑每条评论
但请注意,必须在 OCaml 中显式请求子类型。例如,如果您有一个函数f : u -> int
,并且您想将其应用到v : t
where t
是一个子类型u
,你必须写f (v :> u)
. The (v :> u)
语法是一种类型强制。
OCaml 还支持行多态性,这是一种带有约束的参数多态性形式。如果f
相反是f : #u -> int
(对于对象类型)或f : [< u] -> int
(对于多态性变体),#u
/[< u]
语法表示类型变量,类似于'a
,但只能用相应的“子类型”替换u
(在有限的意义上,它们分别可以支持更多的字段/更少的构造函数)。然后,你可以做f v
没有强迫。 OCaml 自动推断对涉及多态变体和对象的许多表达式使用行多态性的类型,但如果要创建签名,则必须显式编写类型。
行多态还有更多的用法和注意事项。我忽略了实际的行变量和附加语法,只描述了一些看起来像有界量化的东西(如 Java 泛型中的那样)。对行多态性、其名称和/或其形式主义的更详细和准确的讨论可能最好保存在单独的问题中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)