问题标签 [match-types]

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

scala - Dotty 提供什么来替换类型投影?

我一直在阅读 Dotty,因为它看起来即将成为 scala 3,并注意到类型投影被认为是“不健全的”并从语言中删除......

这看起来很糟糕,因为我已经看到了几个真正有用的用例。例如:

如何在 Dotty 中做这样的事情?添加第二个类型参数到Manager? 但是,除了它使创建和操作 的实例变得非常乏味之外Manager,它也不太有效,因为没有办法强制这两种类型之间的关系(Manager[FooContainer, Bar]不应该是合法的)。

然后,还有其他用途,如 lambda 类型和部分应用类型,它们对于创建有偏函子等很有用……或者这些(部分应用类型)是否成为 Dotty 中的“一等公民”?

编辑

为了回答评论中的问题,这里有一个他可以使用的有点做作的例子。假设,我Managers实际上是 Akka Actors

0 投票
1 回答
408 浏览

scala - 如何在 dotty 中使用缩小的 String 类型的元组大小写头部编写匹配类型模式?

我目前正在尝试了解 Scala 3/dotty 中的新功能。所以我想重做一些我以前用 shapeless 尝试过的东西。"a" :: "c" :: "f" :: HNil给定一个缩小字符串类型的异构列表(在我理解的无​​形中,它会是无形的,并且可以使用元组("a", "c", "f")),我想根据一些映射替换类型。例如考虑以下伪代码:

为此,我想出了以下代码。重新映射单个缩小的 String 类型正在工作。但我也无法让它与元组一起使用:

我得到的编译错误Type argument s does not conform to upper bound String在以下行:

我使用了 dotty 版本0.18.1-RC1,因为它是 Scastie 上最新可用的版本。这是您可以尝试的链接:https ://scastie.scala-lang.org/BKzhEV7PRiKyfQ3CE2vjww

这不支持吗,有没有办法实现这一点,即如何进一步限制匹配类型中的类型模式(我试过case (s <: String) *: rest =>,但编译器失败并出现错误:)scala.MatchError: Parens(Ident(s)) (of class dotty.tools.dotc.ast.untpd$Parens)?还有更好的方法来实现我总体上尝试做的事情(在 dotty 的当前能力范围内,比如erasedand inline)?

0 投票
1 回答
446 浏览

scala - 如何在dotty中解包元组中的元素类型?

假设我有一个类定义为:

我想编写一个通用方法,将 tuple 解压缩为type(Box[A1](a1), .., Box[An](an))的 tuple 。(a1, .., an)(A1, .., An)

我试过Match Types没有运气:

0 投票
1 回答
267 浏览

scala - 如何使用匹配类型实现 SKI 组合器演算?

我试图使用匹配类型在 Dotty 中实现SKI 组合器演算。

SKI 组合微积分的简要说明:

  • S, K, 和I是项
  • (xy)is an term if xand yare terms and is like 函数应用
  • (((Sx)y)z)(same as Sxyz) 返回xz(yz)(same as (xz)(yz))
  • ((Kx)y)(相同Kxy)返回x
  • (Ix)返回x

以下是我使用R的(尽可能减少术语)。一个术语(xy)被写成一个元组(x,y), 和S, K, 和I是特征。

但是,以下 2 行无法编译(出于相同的原因)(Scastie):

该错误说它需要(K,K)但找到R[((I, K), (I, K))]。我希望它首先看到 S 并将其变成(IK)(IK),或者R[((I,K),(I,K))],之后它应该匹配第一个的评估(I, K)并看到它是K,这与(I, K)使其返回R[(R[(I,K)], R[(I,K)])],它成为R[(K,K)],它成为正义(K,K)

然而,它并没有超越R[((I,K),(I,K))]。显然,如果它是嵌套的,它不会减少术语。这很奇怪,因为我尝试了相同的方法,但使用了实际的运行时函数,而且它似乎工作正常(Scastie)。

正如预期的那样,来自println(r((((S, I), I), K)))的输出。(K,K)

有趣的是,删除它的规则K让它可以编译,但它不能识别(K, K)R[(K, K)]作为同一类型。也许这就是导致问题的原因?(斯卡斯蒂

0 投票
1 回答
117 浏览

scala - 柯里化类型“不带类型参数”

我想制作一种可以用来验证元组是否同质的类型。我写了这个,它应该确保所有元素T都等于XScastie):

无论出于何种原因,第三行都无法编译,并出现以下错误:

同质[X] 不带类型参数

但是,如果我Homogenous使用 2 个参数,它会编译,但我不能再使用上下文绑定(Scastie)。

我不明白为什么会这样。并不是说 lambda[T] =>>只是从匹配类型的特定情况下返回的,所以编译器应该意识到它Homogenous[X]总是需要一个参数。这是一个错误还是我做错了什么,是否有修复/解决方法?

0 投票
1 回答
383 浏览

scala - 如何让匹配类型在 Scala 3 中正常工作

我很好奇是否可以移植我的无类型项目以使用 Scala 3 进行类型化。这是我的开始:

它不编译,它抛出一个错误:

我认为这是因为它没有将模式匹配视为 s 的“类型过滤器”,因为它认为在这种情况下 s 具有 type "tag" | "attrs" | "children",而模式匹配情况应该将其减少为“标记” .

如何实现我请求的行为?

0 投票
1 回答
236 浏览

scala - Scala 3 / Dotty 中的依赖元组

我正在尝试使用依赖元组列表对依赖映射进行编码。这是我所拥有的不起作用的:

我得到的只是

我想不出一种模式匹配的好方法,d.second以便它的类型取决于 d.first。我可以添加.asInstanceOf[Array[String]].asInstanceOf[String]但这不是这里的目标,我正在尝试对代码进行类型检查。

0 投票
1 回答
317 浏览

scala - 通过在 Scala 3 中展开类型将案例类转换为另一个案例类

我有一个表示容器和两个案例类的枚举:

我想在 Scala 3 中编写一个通用函数,将所有案例类转换为类似PersonTemplate的对应类Person,例如:

我尝试了几种方法,但都没有成功,主要是因为我不明白如何使用 Scala 3 Tuple,它在我看来与 Scala 2 Shapeless 不同HList(即使在无形中我也不是那么好)。

我的总体方法是:

  1. 在元组中转换案例类。为此我发现Tuple.fromProductTyped
  2. 将每个元素约束为Container[_]. 我发现Tuple.IsMappedBy保证元组具有正确的形状,Tuple.InverseMap并且似乎提取了容器内的类型。不过,我不确定将这段代码放在哪里。
  3. 将(poly?)函数应用于调用的每个值Container.get。由于我在网上发现的一点点,我最终使用了很多,.asInstanceOf这对我来说似乎不合适。
  4. 使用将结果转换Tuple为输出类型summon[Mirror.Of[O]].fromProduct(output)

为了完整起见,这是我尝试的最后一个代码,当然不起作用:

0 投票
0 回答
49 浏览

scala - Peano 数字类型级实现适用于类但不适用于特征

以下使用匹配类型对 Peano 数进行减法的类型级实现有效

但是,如果将类更改为特征

那为什么它不起作用

0 投票
1 回答
305 浏览

scala - 如何询问 Scala 是否存在所有类型参数实例化的证据?

给定 Peano 数的以下类型级加法函数

说我们想证明定理

对于所有自然数 n,n + 0 = n

也许可以这样指定

那么在为定理提供证据时,我们可以很容易地要求 Scala 编译器在特定情况下提供证据

但是我们如何询问 Scala 是否可以为 的所有实例生成证据[n <: Nat],从而提供 的证明plus_n_0