问题标签 [f-bounded-polymorphism]

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 投票
3 回答
904 浏览

scala - 对于返回电流类型问题,F 有界多态性相对于类型类的优势

在 StackOverflow 上经常会问到返回当前类型的问题。是一个这样的例子。通常的答案似乎是F 有界多态性类型类模式解决方案。Odersky 在Is F-bound polymorphism 有用吗?

F-bounds 确实增加了显着的复杂性。我希望能够摆脱它们,并用更高级的子类型替换它们

而 tpolecat (链接帖子的作者)建议

一个更好的策略是使用类型类,它可以巧妙地解决问题并且几乎没有担心的余地。事实上,在这些情况下完全放弃亚型多态性是值得考虑的。

确定了以下缺点

F-bounded polymorphism 将一个类型参数化为它自己的子类型,这是一个比用户通常想要的更弱的约束,这是一种说“我的类型”的方式,你不能通过子类型精确地表达它。然而类型类可以直接表达这个想法,所以这就是我要教初学者的

我的问题是,根据上述建议,有人可以证明 F 有界多态性是有利的情况,还是我们应该将类型类解决方案作为解决返回电流类型问题的规范答案?

类型参数的 F 绑定多态性

类型成员的 F 有界多态性

类型类

0 投票
1 回答
154 浏览

scala - 使用更高种类的类型参数时,理解类型参数不符合类类型参数边界错误

我试图理解为什么当我在 MyModel 中为 T 使用更高种类的类型参数时,以下代码将无法编译

但是,如果我将其更改为new Bar[MyModel[Any]]它将编译。为什么是这样 ?

0 投票
2 回答
90 浏览

scala - 如何将 F 有界多态性与 Scala 中的关联类型结合起来?

我有一个特点,要求Graphlike作为图表工作的东西。值得注意的是,我想要的属性之一是该方法g.subgraph(Set(1, 2, 3))将返回一个仅具有顶点 1、2 和 3 的相同类型的子图。显然,这意味着我想要 F 有界多态性,Graphlike看起来像这样:

我还有一个特征,它代表一个自动机,它具有关联的边和顶点类型。我希望它表现得像一个图表。简化后,它看起来像这样:

这几乎可以工作。但是,当我尝试将两者混合并对结果做一些有用的事情时,Scala 的类型系统会感到困惑:

给出如下错误:

我如何让 Scala 理解这两种关联类型在所有派生对象中都是相同的?

0 投票
3 回答
99 浏览

scala - 如何在 Scala 中为具有一个或多个值的容器实现 ADT

归根结底,这是我想要实现的目标:

为了实现这一点,似乎需要一个代表一个或多个值的 ADT。

这是我的实现。是否有另一种/更好/更简单的方法来实现它(我使用了路径相关类型和 F 有界类型)。是否有一个已经实现它的库(用例似乎很流行)。

0 投票
2 回答
115 浏览

scala - 如何从推断类型中取出 Nothing

这个想法来自这个视频:https ://www.youtube.com/watch?v=BfaBeT0pRe0&t=526s ,他们在那里谈论通过实现自定义类型来实现类型安全。

一个可能的简单实现是

myData 的类型是Option[DataSet[Nothing with T1 with T2]]. 这是有道理的,因为在没有任何类型参数的情况下调用构造函数,但在视频中它们显示的类型符合DataSet[T1 with T2].

当然,通过显式传递类型来更改调用Nothing,但是指定类型参数值是多余的,因为类型已经包含在 arg 列表中。

0 投票
1 回答
56 浏览

scala - 如何使用参数化类作为键来操作地图

我正在尝试定义一个以参数化类为键的映射。但是当我尝试添加它时,我得到一个编译器错误:

我收到以下编译器错误:

将我的课程提取为密钥的正确方法是什么?如果我使用具体的类,它编译得很好,例如:

0 投票
1 回答
86 浏览

scala - 如何为泛型类型定义类型

假设我有以下代码:

有没有办法可以定义一种类型来缩写我对 A 类和 B 类的定义?

所以像:

0 投票
2 回答
270 浏览

java - 将类的子类作为类型参数传递(类型参数是子类)

让我们考虑一下:

我们可以看到Text BinaryComparable

那么,我们来考虑

我在 Scala 中有一些课程:

无法创建

由于类型不匹配。为什么?毕竟TextBinaryComparable 如何解决的呢?

0 投票
1 回答
67 浏览

scala - 为什么在 Scala 中的 f 有界多态性通常使用上限类型和自类型来实现

为什么 Scala 中的 f 有界多态性通常使用上限类型self 类型来实现

不仅仅是像这样的自我类型

第一个示例中的上限类型似乎是不必要的。至少我找不到使用一个的任何好处。我在这里忽略了什么吗?然而,类型边界确实妨碍了诸如

(当然,在这个简单而人为的示例中,afunc[A <: MyTrait[A]]可以解决问题,但在更复杂的环境中可能无法实现)

我发现 f-bounded polymorphism 在多个库中使用类型绑定实现甚至在关于该主题的介绍性博客文章中(https://tpolecat.github.io/2015/04/29/f-bounds.html)我想知道如果最好省略一般绑定的类型。

0 投票
1 回答
69 浏览

scala - 泛型类型参数的下划线会在 Scala 中产生编译错误?

我有

所以写

T为in产生类型绑定错误MyBase

写成

编译白化任何错误。

为什么会这样?这两个签名在MyBaseContainer语义上不是等效的吗?

是否有一种语法方法可以将类型参数约束MyBase到所需的边界,而不T作为类型参数传递给MyBaseContainer