问题标签 [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.
scala - F 有界存在量化
在尝试理解 scala 的类型系统时,我遇到了 F 有界类型的存在量化。
让A
成为一个类型
其中F
是 的 F 有界自类型A
。
还有B
一些亚型A
如果我尝试用存在量化声明 a List
ofA
分配a
的List
时出现错误B
。由于某种原因,scala 推断出 type List[A[Nothing]]
。
当应用简化规则 4(如scala-spec中所述)时,协变的出现T
可能会被上限替换(这里A[T]
:)
这两个例子应该是等价的(如果我没有误解的话),但简化的例子很好。此外,以下也是正确的,应该是等价的:
但是由于某种原因,类型c
和类型b
不相等。
所以我的问题是:这是 scala 编译器的错误还是我误解了一些重要的东西?
编辑:我的假设是否正确,即 和 的类型c
不b
相等,因为存在量化中c
没有看到 的协变出现T
?
scala - Scala - 继承树中的多个 F 有界类型
我在 Scala 中有一个通用的 F 有界特征。让我编写返回相同底层实现类型的方法,超级!但是现在让我们说一个子特征也定义了需要 F-bounding 的方法。Scala 向我发送了没有意义的编译错误:
尝试使用ComplexUser1
or进行编译会ComplexUser2
导致:
这对我来说没有意义。AnyComplexImpl
绝对实现FBounded
。我错过了什么,还是类型检查器在这里让我失望了?
编辑:
编译就好了。那么为什么不通用版本呢?
scala - 如何正确定义 f 绑定多态类型的存在
这里有几个类似的问题,我阅读了它们,但没有找到可以让我的代码正常工作的答案。我想我遇到了一个需要比正常情况更精确的类型规范的极端情况。
我的情况就两个字。我想构建一个非常简单的异构列表示例来加深我对 scala 语言的理解。我给自己设置了一个限制:没有任何形式的隐含,只是简单的 scala 类型系统。隐式可以使许多事情变得更容易,但我想努力尝试。
我已经有工作代码,但我想改进它。这里是:
类型构造函数表示附加两个列表的Merge
类型结果。需要跟踪所有嵌套类型。结果如下:
现在我已经完成了无聊的介绍。恐怕到那时我已经失去了一半的读者。我希望我能让代码折叠成单行。
所以真正的问题是Self
类型和self
方法。它们看起来很丑,我想摆脱它们。我相信 f 有界多态性可以以自然的方式帮助我。我得到以下代码:
scala 编译器产生的错误让我很少见识:
前置部分平滑地转换为 f 绑定多态性。合并部分产生错误。我需要对Merge
类型进行抽象,所以我将它与HAny
存在类型绑定,就像我在HList
没有任何额外类型规范的情况下使用的早期示例一样。
但是在后一种情况下,一些类型信息会丢失,因为编译器会抱怨不合适的类型。那么如何定义存在类型来保存构建所需的所有类型信息HCons
呢?也许我需要更复杂的调整来将抽象类型解决方案转移到 f-bound 变体?
scala - 为什么 scala 无法对 f 绑定多态性进行类型推断?
一个简单的例子来说明这个问题:
Box
没问题,但Zero
会产生错误:
如果我手动注释类型,它会编译:
第一行按预期工作。我经常遇到无法从参数中推断出类型参数的情况。例如def test[A](x : Int) : Unit
。该A
类型没有出现在参数签名中,因此您应该手动指定它。
但后者对我来说非常模糊。我刚刚添加了始终正确的类型转换,编译器奇迹般地学会了如何推断方法类型参数。但是Zero
总是Zero
类型,为什么编译器在没有我提示的情况下无法推断它?
java - 受接口绑定的 Java F-Bound
符号:Inter
是接口;Abs[N]
是一个抽象类。
以下代码在 Java 中运行良好,没有问题:
但是,如果您想通过 上的接口引入另一个绑定T
,我还没有找到任何简单的方法来做到这一点,即:
不起作用,因为Abs1
作为抽象类不能用作边界参数。我发现的最简单但丑陋(丑陋吗?)的解决方案是:
我有一种预感,在具有特征的 Scala 中存在一个更优雅的解决方案,但是对于 Java 有什么提示吗?
scala - 解析 F 有界多态性中的类型
我有这些模型:
如果我获得 a 的实例Vehicle[Car]
并调用update()
,我将获得 a Car
。由于Car
extends Vehicle[Car]
(或者简单地说,Car是Vehicle[Car]),我可以安全地将结果的类型显式设置为Vehicle[Car]
:
但是,如果我想将Car
和的实例Bus
放在一个列表中,那么我必须将列表类型设置为Vehicle[_ <: Vehicle[_]]
(拥有一个简单的列表并在一个元素上Vehicle[_]
调用会 yield ,但我希望能够使用所以我必须使用 F 有界类型)。使用存在类型会破坏类型关系,因为一旦我从 Vehicle 中获取底层汽车/公共汽车,我就不能再将其转换为 Vehicle 因为......好吧,它只是一些存在类型:update()
Any
update()
因此,Vehicle
用某种类型参数化,T
该类型是Vehicle[T]
. 当我撕掉T
(通过使用update()
)时,在具体类型的情况下没关系 - 例如,如果我撕掉Car
,我可以安全地声称我撕掉了 aVehicle[Car]
因为Car <: Vehicle[Car]
。但是,如果我撕掉一个存在类型,我就无能为力了。前面的示例有效,因为Car
is a Vehicle[Car]
,但在这种情况下_
不是 a Vehicle[_]
。
指定我的具体问题:对于上面给出的模型(车辆、汽车、公共汽车),有没有办法实现这一点?
请注意,您可以更改给定的特征、类和类型seq
,但有一个限制:update()
必须返回T
,而不是Vehicle[T]
。
我知道使用 shapelessHList
可以解决问题,因为我不必使用存在类型(我只需要一个汽车和公共汽车的列表,并且会保留该类型信息)。但我想知道这个特殊的用例是否有一个简单的List
.
编辑:
@RomKazanova 是的,那当然可以,但是我需要在前后保留相同的类型update()
(尽管这是对努力的支持;))。
我相信没有 HList 或类似的数据结构是不可能的,因为统一汽车和公共汽车迫使我们使用车辆类型,这会丢失关于其基础类型是 Car、Bus 还是其他东西的信息(我们所知道的是它是一些类型_ <: Vehicle
)。但我想和你们核实一下。
c++ - 具有可变参数的虚拟方法
我正在尝试实现一个在定位器服务后面抽象的日志系统(以本指南的风格),以便日志系统可以针对各种不同的日志情况进行子类化。我希望能够使用 printf 样式格式字符串而不是 <<,但这意味着支持可变数量的参数。可变参数模板可以很容易地解决这个问题,但是它们不能是虚拟的,这意味着基础日志类不能是抽象的(作为接口)。
理想情况下,我需要某种方法使父方法不被模板化,而只是接受一个参数包,它将转发给正确的(模板化的)子方法。我主要见过两种方法,一种是使用 va_list ,这显然是不安全的、复杂的,并且并不真正意味着要轻松地与可变参数模板交互,而 CRTP 可以工作,但意味着不能声明抽象的指针定位器对象中的基类而不知道子类类型,这违背了目的。
这是假设虚拟模板是一个东西的示例代码:
这是 CRTP 解决方案的示例代码(它破坏了定位器):
这是定位器:
scala - 带有 f 有界多态性的 scala 存在的奇怪编译错误
为什么下面的代码无法编译?
它给:
编辑:
这是一个相关的、自包含的代码片段:
- 似乎
r4
必须具有类型A[C]
然后r10
编译。 - 所以这表明
A[_<:SomeB]
forr3
不够具体。但为什么不呢? - 还有为什么
A[_<:SomeB]
足够val r5: (A[_<:SomeB]) = (r3)
但不适合r9
?
scala - 理解 Scala 中的 F-bound 多态性
我试图了解它是如何工作的。这是我尝试过的:
问题是继承层次结构的长度是否超过 2。在 Test2 的情况下,这绝对不是我想要的。有没有办法防止在编译时发生类似的事情?
scala - 使用 Akka 演员获得正确的方差?
在使用泛型和 Akka Actor 时,我经常遇到以下问题:
这AuctionParticipantActor
只是一个不可变的包装器AuctionParticipant
。我需要类型P
是协变的,我不确定实现这一目标的最佳方法是什么。
或者,对于我的用例,我认为我什至不需要参数化AuctionParticipantActor
. 我可以有类似的东西:
但在这种情况下,我不知道用什么代替???为了尊重类型绑定。如果有人认为我的问题出在设计上,请说出来。想法?