问题标签 [subtyping]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
658 浏览

type-theory - 子类型和包含有什么区别?

子类型和包含有什么区别?包容是否意味着隐性强制?

0 投票
2 回答
1574 浏览

c++ - 覆盖运算符以使用 C++ 中的派生类

我试图覆盖子类中的虚拟比较运算符,但我收到编译器错误,说派生类没有实现基类的虚拟运算符。

我感觉这与我的派生运算符不使用基类的参数类型有关。

一个简化的版本如下:

我有办法做到这一点,还是我必须在Derived实现中进行类型检查以查看它是否是正确的类型?

0 投票
1 回答
381 浏览

haskell - 允许未标记的联合是否等同于允许类型类?

这个问题中,未标记的联合被描述为一种子类型。

类型类也是子类型的一种形式。

它们在概念上是否等效?他们是,我将如何在 Haskell 中实现这些?

0 投票
0 回答
253 浏览

python - Python 中的协议(又名结构子类型)是什么?

但为此它失败了

有一个类似的问题,但没有答案

协议不能与 isinstance 一起使用为什么不

0 投票
2 回答
203 浏览

covariance - Eiffel:协变非法类型作为参数传递?

(强调我的)

字段和函数的协变重新定义没有问题,但是 参数的协变重新定义确实会产生一个问题,即非法类型可以作为参数传递。

但是,如果重新定义字段和函数类型协变没有问题,那么重新定义参数的类型协变怎么会导致麻烦呢?

协变重新定义等于子类型化,对吧?子类型可以代替它们的超类型!

有什么问题?

0 投票
2 回答
311 浏览

scala - Scala通用列表添加

我有功能:

上面的代码示例工作正常,但是当我更改为下面的函数时,它停止工作并出现错误

找不到参数的隐式值abc: Numeric[AnyVal]

既然AnyVal是我可以添加的基本类型,不是吗?

所有隐含定义在哪里?

这也不起作用,我认为出于同样的原因。

0 投票
1 回答
113 浏览

c++ - 如何在子类型上调用函数?

我目前正在设计一种编程语言,我很好奇如何解决这个问题:

假设我有一个如下所示的类(或接口)A:

和第二个 B 类扩展它,看起来像这样:

并且我有一个看起来像这样的函数 f:

但是,如果我用两个 B 调用它,则 second.a 不会与用两个 As 调用它位于同一位置,因为第一个参数会移动它。我目前解决这个问题的想法是:

  1. 不允许未知大小的参数,并强制它作为指针或引用传递(我认为这就是 Rust 所做的)
  2. 将以下所有信息写入调用堆栈:指向第二个的指针、指向第二个之后的指针、非可变大小参数、第一、第二
  3. 为 first 和 second 的每个可能大小创建一个函数,并确定在编译时(如果已知)或在运行时使用 vtables 调用哪个函数。

第二个想法将是一个问题,因为它需要得到所有函数的支持,即使它们很少或从不使用子类型调用,这是低效的。

第三个想法需要创建很多函数(一个接受 5 个参数的函数,这些参数可以是 20 种不同的子类型,如果只调用一个具有未知类型参数的函数,则需要生成 100 段类似的代码),并且对于只有一个函数使用它的每个类,都需要一个 vtable。此外,已编译库中的函数不能与新子类型一起使用。

结合 2 和 3 并创建相同函数的两个版本,一个只接受类型,另一个也接受子类型可以解决其中一些问题。

我很好奇是否有更好的解决方案,以及 C++ 等其他语言如何实现这一点。

0 投票
2 回答
485 浏览

ios - 调用了错误的通用重载函数

我试图理解为什么泛型方法的 where 子句被忽略

我在 Swift 3 中做了一个简单的用例(如果你想摆弄它,你可以在操场上复制代码):

好的,现在让我们运行一些测试。如果我们有:

输出是:

嗯......显然,为了使where协议子句起作用,我们需要传递一个符合其定义中协议的强类型。

仅使用超类型是不够的,即使在测试#3 中很明显给定实例实际上符合HasChildren协议。

那么,我在这里缺少什么,这是不可能的吗?您是否有一些链接可以提供有关正在发生的事情的更多信息,或者有关where子句或子类型及其一般行为的更多信息?

我已经阅读了一些有用的资源,但似乎没有一个关于它为什么不起作用的详尽解释:

0 投票
1 回答
262 浏览

scala - Scala 中的子类型化

我创建了一个扩展到 Counter 的类,它跟踪加法和减法。我试图调用 xs,然后返回 xs 在实例上调用的数字上升或下降的总和,它正在编译但它失败了。

谢谢大家,我真的可以通过了。我需要创建另一个变量来跟踪我的增量和减量,然后在 def inc 和 def dec 中,我将添加到 count 的 add 或减去 :)

0 投票
1 回答
219 浏览

ocaml - Ocaml 通过与值的接近程度来消除推断类型的歧义?

ocaml 顶级(4.01.0)推断intersect1as的类型small1。我以为我明白了原因:small1看起来像是large1.

但现在:

顶层现在推断出一种large2for intersect2。这使它看起来像接近被用作决胜局,但这非常令人惊讶,并且与我使用的其他语言不同,所以我怀疑这里有一些微妙的东西我误解了。

一个并发症:正如激发这个问题的答案的问题所指出的那样,“更接近”的类型并没有完全隐藏更远的类型。

zell被赋予类型left -> right

推断这些类型的具体规则是什么?在手册(或任何其他已发表的论文或文档)中我可以在哪里阅读更多信息?

这个问题的灵感来自于一个关于多态变体的问题的旧答案。