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

2024-02-08

我在理解不同类型的多态性时遇到问题,特别是关于 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(使用前将#替换为@)

OCaml 中的多态性 - 特别、参数、包含/子类型 的相关文章

  • 什么才是真正性能更高的? Haskell 或 OCaml [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将指针从基类型转换为子类型

    我正在为我的一个项目构建一个简单的游戏设计 我有以下课程 class Character public virtual void Display virtual void SetParameters char param class Non
  • 如何使用List.fold_left?

    我仍在尝试了解如何fold left完全有效 它是否像这样迭代列表List iter 或者我的代码还有其他问题吗 我认为 e 是列表中的元素 所以它是一个元组 并且fst e获取元组的第一个元素并且snd e获取元组中的第二个元素 let
  • 派生类的初始值设定项列表

    我想要一个派生类 它有一个默认构造函数来初始化继承成员 为什么我可以这样做 class base protected int data class derived public base public derived note data 4
  • 使用 OCaml 警告属性禁用警告 8:不详尽的匹配

    我正在尝试编写类似于以下内容的代码 let a b body 1 2 我想仅针对该模式禁用警告 8 a b 而不是为了身体或让之外的任何东西 我尝试设置警告属性来禁用警告 但以下方法都不起作用 let warning 8 a warning
  • C++:错误:“类”没有命名的成员

    对于我的毕业论文 我正在编写一些有限元代码 或者更准确地说 我正在修改现有程序 该程序基于我的教师提供的 2 类库 因此 我无法修改这些类 因为它们是通用的 我创建了一个类BurgersMSrc 它继承自父类ValSrc 我用一种方法扩展了
  • 如何返回派生类型?

    我有一个 Validator 类及其派生类 当我尝试返回指向派生类的指针时 方法返回基类 验证器 而不是派生类 class Validator public std string m name BaseValidator static co
  • 编译器错误:对调用的引用不明确

    Case 1 static void call Integer i System out println hi i static void call int i System out println hello i public stati
  • 将对象从一个派生类更改为另一个派生类

    我有几个类共享一个公共基类 除了它们的方法工作方式不同之外 因此 在下面的示例中 加法器和乘法器除了执行计算的方式不同之外都是相同的 有没有办法即时将 a 更改为乘数 我是否需要实现派生类之间相互转换的方法 例如就像是 a a asMult
  • OCaml:如何运行包含库的脚本

    我正在按照 Real World OCaml 一书来学习 OCaml 许多程序都需要使用 Jane Street Core 库 当我在顶层使用这个核心库中的函数时 它工作得很好 在那里 我只需使用以下命令来打开 Core 库 use top
  • 如何使用工厂来创建使用策略模式的对象?

    假设我们的在线商店有一个简单的支付功能 我们希望使用不同的交易处理器来管理不同的交易 交易可以是付款或退款 交易处理器可以是 Paypal 或 Payplug 所以我们有以下课程 class PaymentTransaction imple
  • OCaml 中的线性类型

    Rust http www rust lang org 有一个线性类型系统 有什么 好的 方法可以在 OCaml 中模拟这个吗 例如 当使用 ocaml lua 时 我想确保仅当 Lua 处于特定状态 堆栈顶部的表等 时才调用某些函数 Ed
  • 如何在 OCaml 中使协变可观察

    我正在尝试为值制作一个包装器 允许调用者自行注册以获取有关它的通知 这是一些 工作 代码 module Thing sig type a t val make a gt a t val watch a gt unit gt a t gt u
  • 有人可以解释一下这个 OCaml 程序中使用的类型语法吗?

    以下类型取自这个问题 https stackoverflow com q 50586942 633183 contains an error later fixed by the OP type task Success a gt a ta
  • Dart 2 类的构造函数与其他语言的多态性非常相似

    我需要用 a 来表示一张照片Dart 2班级 照片可以是矩形的 or circular 因此 通过多态性我可以写 import dart math class Photo double width double height double
  • OCaml 文字负数?

    我在学 这是我觉得奇怪的事情 let test treeways x match x with when x lt 0 gt 1 when x gt 0 gt 1 gt 0 如果我这样称呼它 test threeways 10 我会得到类型
  • 对两种类型之间的二元关系进行建模

    有企业 也有人 用户可以对某个企业点赞或发表评论 但效果是一样的can not发生在一个人身上 当用户发布有关某个企业的内容或对其点赞时 该企业就被称为target喜欢或帖子 trait TargetingRelation Targetin
  • 如何使用继承来建模 RESTful API?

    我有一个需要通过 RESTful API 公开的对象层次结构 但我不确定我的 URL 应该如何构建以及它们应该返回什么 我找不到任何最佳实践 假设我有从动物继承的狗和猫 我需要对狗和猫进行CRUD操作 我还希望能够对一般动物进行手术 我的第
  • RankN多态性和令人发指的克莱斯利之箭

    我不明白为什么 demobind1 的定义会产生一些编译器错误 它看起来像一个愚蠢的翻转 但不知何故 LANGUAGE GADTs LANGUAGE RankNTypes ScopedTypeVariables TypeOperators
  • 如何强制 OCaml 推断出更通用的类型?

    我想定义一个接受可选参数的函数 该参数是一个函数 a gt b 默认值应该是identity 实际上就是 a gt a 但我认为没有理由它不应该与更通用的兼容 a gt b 当我尝试时 let optional apply f i matc

随机推荐