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 中的多态性 - 特别、参数、包含/子类型 的相关文章

  • 我无法从指向派生类的指针和指向基类的指针的指针进行分配? [复制]

    这个问题在这里已经有答案了 可能的重复 派生 到基础 之间的转换 https stackoverflow com questions 8026040 conversion between derived to base 在主要使用 Pyth
  • FindObjectOfType 返回 null

    我遇到的问题是我捡起一个掉落的物品 为枪添加弹药 使用所有方法和变量构建了一个 Gun 类 构建了一个从 Gun 类派生的 Rifle 类 步枪工作完美 没有任何问题 我现在添加一个 拾取 系统 其中 x 数量的敌人会掉落拾取 这是要拾取的
  • 在 OCaml 自定义顶层设置提示

    在 OCaml 自定义顶层中 有没有一种方法可以通过编程方式设置提示 到别的东西 我希望能够更改它以响应用户的最后一个自定义功能 有点像bash你如何设置PS1 我什至找不到 directive 来更改它 谢谢 在 toplevel top
  • 映射存在类型列表

    我有一个要映射的存在类型对象的列表 像这样的东西 sealed abstract class IntBox val v Int case object IB1 extends IntBox 1 case object IB2 extends
  • C++ 多态加载/保存

    我正在保存并重新加载一堆从公共基础派生的不同对象到一个文件 显然我需要存储类名 或类似的名称 以便在重新加载时创建正确的对象类型 保存很简单 class Base virtual string className const 0 void
  • Ocaml 模块和包的区别

    我基本上是在尝试遵循这篇文章中的 stackoverflow 答案 OCaml 中 HttpRequest 的最佳模块是什么 https stackoverflow com questions 14134116 what is the be
  • 如何使用继承来建模 RESTful API?

    我有一个需要通过 RESTful API 公开的对象层次结构 但我不确定我的 URL 应该如何构建以及它们应该返回什么 我找不到任何最佳实践 假设我有从动物继承的狗和猫 我需要对狗和猫进行CRUD操作 我还希望能够对一般动物进行手术 我的第
  • OCaml 中的不可变变量

    我正在学习 OCaml 我对变量的不变性有点困惑 根据我正在读的书 变量是不可变的 到目前为止一切顺利 但到底为什么我可以这样做 let foo 42 let foo 4242 我缺少什么 我认为最好的解释方法是举个例子 考虑以下代码 在
  • 调用基本方法而不是覆盖方法

    在 C 中 类A包含一个公共方法Foo 它进行一些处理并返回一个值 protected method Bar 也在课堂上A执行与以下相同的逻辑Foo 然后进行一些额外的处理 然后返回一个值 为了避免重复代码 Bar calls Foo 并使
  • 如何考虑子类型的多态性

    里氏替换原则指出 超类型的不变量必须保留在子类型中 我对这个原理和多态性的交叉特别感兴趣 事实上 特别是子类型多态性 参数多态性和 Haskell 类型类似乎就是这种情况 因此 我知道当函数的参数是逆变且返回类型是协变时 函数是子类型 我们
  • Scala 将递归有界类型参数(F 界)转换为类型成员

    我将如何转换 trait Foo A lt Foo A 给类型成员 也就是说 我想要以下内容 trait Foo type A lt Foo type A 但我遇到了困难 因为名称 A 已在类型细化中使用 这个问题是类似的 并衍生自 通过类
  • 为什么 GHC 在这里推断出单态类型,即使禁用了单态限制?

    这是由解析 f f pure 的类型 https stackoverflow com questions 55388119 resolving the type of f f pure 55388309 noredirect 1 comme
  • 创建指向类对象的指针数组

    问题 创建一个至少包含四个指向 Reader 对象的指针的数组 使用 New 运算符创建至少四个指向派生类对象的指针并将它们分配给数组 我不确定我做对了还是错了 Reader 是基类 John David Daniel Mark 是派生类
  • 在 Yii2 中从数据库中多态查找模型

    我在数据库 mysql 中有一张表 但该表存储了几种略有不同类型的行 类型取决于此表的type柱子 我有一个表的抽象 ActiveRecord 类和几个后代子类 它们为不同类型的同一表的行实现略有不同的逻辑 现在我正在为所有类型的行实现更新
  • 多态 MVC 视图

    因此 我在 ASP NET MVC 中制作一个注册页面 其中有一个字段列表 该列表会根据许多条件 从数据库中获取 而变化 在每次更新数据库时不更改代码的情况下 在视图上显示这些字段的最佳方法是什么 我正在考虑的当前系统是制作一个带有 名称
  • void* 指针的 C++ 替代品(不是模板)

    看来我对 C 有一个根本性的误解 我喜欢多态容器解决方案 谢谢你让我注意到这一点 所以 我们需要创建一个相对通用的容器类型对象 它还恰好封装了一些业务相关的逻辑 然而 我们需要在这个容器中存储基本上任意的数据 从原始数据类型到复杂类的所有数
  • 函数和多态性中的默认参数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 通过命令行参数选择要使用的 ocaml 模块

    在我的代码中我有module M Implementation1然后我参考M 代替Implementation1 问题是 我必须重新编译我的程序才能改变Implementation1 to Implementation2 我想通过命令行参数
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • OCaml 是否具有通过引用传递的能力?

    在 C 中 程序可以向函数传递引用 而不是值 void incrementInt int x x OCaml 是否提供相同的功能 不 没有严格的等价物 有refs 它们就像指向新分配的内存的指针 还有其他复合数据类型的记录 数组 对象和值

随机推荐