问题标签 [scala-2.13]

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 投票
2 回答
57 浏览

scala - 将视图返回到 ArraySeq 的最佳方法是什么?

理想情况下,当从一个IndexedSeqViewover an工作时,在经过一些操作后将ArraySeq视图转换回 an 时,应该只有一个数组副本(或至少只分配一个新数组) 。 什么是最有效的方式回到一个?ArraySeq
ArraySeq

想到的几个选项:

看起来很有希望,但确实.toArray知道视图在一个数组上并且可以使用快速数组副本来填充新数组?

我猜这是 O(n)

0 投票
2 回答
193 浏览

scala - 在 Scala 中,如何在不知道输出类型或完整类型参数的情况下调用适用于输入类型的多态函数?

由于 Scala 2.12(或者是 2.13,不能确定),编译器可以跨多个方法推断潜在类型参数:

最后一行成功推断A = Int, B = String,不幸的是,这需要a: (Int, String)给出一个实例。

现在我想稍微扭曲一下这个 API 并定义以下函数:

这样可以findApplicable[(Int, String)](commutative)自动生成专用于A = Int, B = String. 有没有办法在语言的能力范围内做到这一点?或者我必须升级到 scala 3 才能做到这一点?

UPDATE 1应该注意,commutative 的输出可以是任何类型,不一定是 Function2,例如我尝试了以下定义:

然后重新定义commutative使用它:

糟糕,这不起作用,类型参数没有像值参数一样得到同等对待

0 投票
1 回答
80 浏览

scala - 当使用 scala 路径相关类型作为函数 codomain 时,为什么无法为该函数添加别名?

这是一个简单的例子:

这给出了编译错误:

(some other)是从哪里来的?它是由明确的类型选择规则引起的编译器错误(理论上应该在 scala 3 中解决)?

更新 1对不起,我刚刚意识到P#Repr不应该称为类型选择,它应该只指val p: P;p.Repr,现在它增加了更多的混乱,因为:

  • 我什至不知道这个语法的名字,但我一直在使用它

  • 它甚至没有在 DOT 微积分中定义。所以scala 3的支持是有问题的

0 投票
1 回答
68 浏览

scala - 在 scala 2.13.6+ 库中,自动生成带有 `$extension` 后缀的函数的目的是什么?

当我阅读scala的反编译字节码时,我发现类下有很多函数scala.StringOps

它们显然是自动生成的(因为它们在源代码或 javadoc 中没有对应项)。然而我找不到任何官方的解释。所以我的问题是:

  • 他们的目的是什么?

  • 如何为自己的项目自动生成类似的功能?

0 投票
1 回答
70 浏览

scala - Scala 运行时编译:如何获取错误消息的行号?

我发现 scala 编译器报告编译错误的方式不同取决于它是在编译时使用还是在运行时使用。

例如,对于一个简单的隐式未找到案例,在编译时报告是:

在运行时,当评估相同的代码并直接捕获错误消息时:

行号和位置光标被省略:;

有没有办法把缺失的部分补回来?

0 投票
1 回答
41 浏览

scala - 使用 self 类型时方法类型混淆

以下代码无法使用 Scala 2 编译(测试 2.13.7 和 Scala 2.12.15):

该代码可以使用 Scala 3 编译。使用 Scala 2 的错误是:

值名称不是 AttributeBase 的成员

extends当使用而不是 self 类型时,它编译得很好:

另一种可能的解决方法是:

为什么Derived.attributed假定的类型是AttributeBase而不是Attribute?这是 Scala 编译器错误,还是某些 Scala 2 限制?

0 投票
2 回答
67 浏览

scala - scala 2中的“-Ydebug-error”选项是什么?它应该打印每个编译错误的每个堆栈跟踪

在调试复杂的 scala 插件时,有时会遇到未知错误,我希望编译器打印出触发每个错误的堆栈跟踪,以确保这些错误不是由我的 pluin 引起的。

在 scala 3 中,此选项可以通过“-Ydebug-error”启用,但我在最新的 scala 2.13.7 中找不到它的对应项。

如何启用此选项?

0 投票
0 回答
25 浏览

scala - 在没有 -Yopt-inline-heuristics:everything 的情况下完全内联 AnyVal 隐式类构造函数

我正在试验 Java 17 Vector API Incubator,我决定看看我是否可以为它创建一个零成本的语法糖。这是我写的一小段内容:

我正在使用 Scala 2.13.5 和 Java 17。

Scala编译器运行-optimize -opt:inline -opt-warnings:at-inline-failed -Yopt-inline-heuristics:at-inline-annotated -opt:nullness-tracking -opt:box-unbox -opt:copy-propagation -opt:unreachable-code -language:implicitConversions -opt:closure-invocations

JVM 使用--add-modules jdk.incubator.vector.

但是,Scala 编译器将test方法的最后一行编译为

这些对隐式类构造函数的调用完全关闭了 Hotspot,并且它无法拆箱矢量变量,从而降低了性能。请注意,隐式类构造函数在字节码方面是一个标识函数,这实际上意味着它是一个空操作。所有的东西MODULE$也都是不必要的。但热点没有看到它。

(请注意,该方法调用+apply已成功内联。)

添加-Yopt-inline-heuristics:everything会删除构造函数调用和MODULE$,并修复性能,但这就像使用大锤来破解坚果一样。就像大锤一样,感觉不安全。

当然,以 Java 风格编写整个代码也可以解决性能问题,但这不是重点。

所以我的问题:

  1. -Yopt-inline-heuristics:everything是否可以在不重写原始 Java 语法的所有内容的情况下消除调用?

  2. Scala 3 有一些新的内联特性。如果没有积极的优化选项,这可以在 Scala 3 中完成吗?

0 投票
1 回答
32 浏览

scala - 是否可以为 scala 归纳列表(scala 2 中的 shapeless.HList 或 scala 3 中的 Tuple)编写“zipAll”函数?

迄今为止,HList 中的“zip”函数的工作方式与 scala 中的 zip 函数或无类型列表类似。它将丢弃较长操作数中的元素以符合较短的元素:

HList 没有等效或类似于“zipAll”函数的操作,如果它太短而无法与另一个操作数一起压缩,则它需要 2 个额外的参数来表示每个操作数的占位符。

是否可以为 shapeless.HList 或 scala 3 Tuple 执行此操作?实现这一点的简短方法是什么?

非常感谢您的意见。