问题标签 [structural-typing]

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 回答
666 浏览

scala - 使用带有 Scala 的结构类型创建更具体的隐式

据我所知,集合库中没有定义该map方法的共享特征(很可能是因为 有不同的签名map)。

我有一个具有更改事件的可观察值(想想 ui 系统中的属性)。可以使用map方法映射可观察值。

然而,当我们使用已经有map方法的类型时,我们应该能够使用map.

所以而不是:

我想像这样使用它:

我有一个简化的测试用例。首先是我使用的不同部分:

如果上面的代码有什么(或者很多)错误,请告诉我。我想像这样使用它:

如果我Container[B]改成Any它会发现RichObservableValue2隐式转换。

我关于如何使用类型来选择隐式的知识是有限的。

我试图在以下位置找到答案,但主题有点压倒性:

有没有办法解决这个挑战?

编辑

我知道FilterMonadic收藏品的特点。我正在寻找一种能够识别类map中定义的方法的解决方案Option

编辑 2

似乎该FilterMonadic变体也不起作用。我添加RichObservableValue3RichObservableValue对象。

List[Int]再一次,虽然 a是一个有效的参数,但没有选择隐式转换。我一定错过了选择隐式时使用的一些规则。

0 投票
1 回答
981 浏览

scala - OCaml、Scala 和 Go 的结构类型实现

在研究结构类型时,我发现以下帖子描述了 Go 中的接口如何在运行时转换为方法查找表。这篇文章中描述的过程似乎与为 Scala 的可选结构类型系统和 Java 语言的 White Oak 扩展描述的反射和生成技术大不相同。

是否有任何深入的资源讨论如何在 OCaml 中实现结构类型?我对与标称类型系统进行优化或运行时性能比较的任何讨论特别感兴趣。

0 投票
2 回答
285 浏览

scala - Scala 集合中的结构类型参数

免责声明: 这是一个关于什么是可能的问题,而不是在实践中推荐什么。

假设您有以下课程:

并且您有包含每个类的一些数量的列表

是否可以使用常用技术(如++, :::)或.union(..)不定义所有类扩展的共同特征来创建可以包含所有三种点类型的结构类型列表,即

我知道如上所述,:::运算符返回一个List[Product]. 我认为这是向 Scala 编译器提供正确提示的问题,因为以下代码确实会生成正确类型的列表:

是否有任何提示可以帮助 Scala 编译器选择正确的类型:::并生成指定结构类型的列表?

0 投票
3 回答
857 浏览

scala - 如何使用带有泛型参数的结构类型?

我有两个案例类

我想定义一个结构类型,它将匹配这两者的伴随对象

这会编译得很好,但是当我尝试像这样使用它时

我会得到一个编译器错误

有没有办法做到这一点?如果我将结构类型重新定义为具有 A 和 R 的具体类型,它将正确编译,但是我失去了灵活性

0 投票
0 回答
1264 浏览

scala - 重载方法和反射调用

在以下 REPL 会话中:

调用 tores0.foo是一个反射调用,因为res0已向 . 添加了一个新的结构成员Object。但是,调用 tores2.foo(1, 2)并没有抱怨缺少import language.reflectiveCalls. 显然def foo: String是造成了那种沉默。不res2.foo(1, 2)应该是反射电话吗?有人可以解释编译器保持安静的原因吗?

0 投票
3 回答
2295 浏览

go - Go 中的结构类型和多态性 - 编写一种可以对具有相同字段的两种类型进行操作的方法

在使用其他语言(如 Scala 和 OCaml)的结构类型之后,我开始研究 Go,并且我正在尝试在语言之间映射一些惯用技术。考虑以下类型

假设我们想编写一个对这两种类型都进行操作的方法来计算它们的极坐标表示,func ConvertXYToPolar(point XYPoint) PolarPoint. 如果CartesianPointand类型为and字段CoordinatePoint定义了 getter 和 setter 方法,我们可以定义为这些方法的公共接口,允许我们对这两种类型进行操作,但就目前而言,接口不能声明字段,只能声明方法。xyXYPoint

基于此,我有几个问题:

  1. 在 Go 中处理这个的惯用方式是什么?
  2. 可以在不修改现有类型的情况下完成吗?
  3. 我们能否保留类型安全,即避免ConvertXYToPolar在不使用空接口类型作为参数和手动转换的情况下进行定义?
  4. 如果接口和隐式接口满足是 Go 中多态性的主要工具,那么接口定义中字段的禁止性是否受到限制?
  5. getter/setter 方法是否通常在结构上定义以规避此限制?
  6. 设计决定背后是否有令人信服的理由支持接口定义中的字段?

我发现嵌入式类型的简单性、隐式接口满足和基于接口的多态性是一种非常简单且吸引人的技术组合,可以提高代码的可重用性和可维护性,但是接口定义中的禁止字段使 Go 的结构化类型功能在我看来有些受限. 我错过了一个简单的解决方案吗?

0 投票
2 回答
324 浏览

c# - 为什么当 C# 完全知道它没有结构类型时,它会取笑它?

今天我很惊讶地看到这是可能的,但我担心这必须事先讨论。

编译器会(对吗?)告诉我在上述情况下存在显式转换。我很高兴能感觉到那里的结构打字,但没有运行时间它失败。那么 C# 什么时候在这里有用呢?这种铸造的任何场景都行得通吗?不管是什么,我确信编译器事先知道myAdder不是ICanAdd,从技术上讲。

0 投票
1 回答
142 浏览

scala - 是否有“更新”的特征,类似于应用的 Function1?

Scala 允许定义update诸如

然后像这样称呼它

有没有封装它的特征?就像是

(当然我可以自己定义这样的特征,但它只适用于我与之混合的实例,而不是与我影响之外构建的其他实例。)

0 投票
3 回答
9369 浏览

scala - Scala:类型类和 ADT 之间的区别?

类型类和抽象数据类型有什么区别?

我意识到这对于 Haskell 程序员来说是一件基本的事情,但我来自 Scala 背景,并且会对 Scala 中的示例感兴趣。我现在能找到的最好的是类型类是“开放的”而 ADT 是“封闭的”。将类型类与结构类型进行比较和对比也会有所帮助。

0 投票
0 回答
106 浏览

java - Java,强类型,协变和逆变

在我的 OOP 课程中学习测试时,我遇到了这个问题,该问题的答案我并不真正理解。问题如下(翻译):

编程语言“Sava”在各方面都类似于 Java,除了以下几点:

  1. 它是结构化类型的
  2. 重写方法时,参数可以是逆变的,返回类型可以是协变的。

给定下面的类和接口,下面的赋值合法吗?

对这个问题给出的答案是:分配是不合法的。C 中的 equals 方法以协变方式更改参数,因此它与 I 中的 equals 方法不匹配。

起初我以为教授忘记添加“Implements I”,但答案还说明了以下内容: 没有接受 C 没有实现 I 的事实的答案,因为鉴于它是一种结构类型的语言,它没有不管它是否是一个子类型。

如果 C 和 I 之间没有子类型关系,我不确定我是否理解我们如何将这些方法称为协变/逆变。

谁能帮我解决这个问题?