问题标签 [scala-compiler]
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 - 容器嵌套类型的Scala隐式转换
考虑以下示例:
此示例不会由版本 2.11.8 的 scala 编译器编译。我使用 IntelliJ Idea 进行编译,但实际上想法不会即时产生错误并显示隐式用于转换:
Intellij Idea 的屏幕截图
为了解决这个问题,我使用了此处描述的方法:
“Scala:进行隐式转换A->B 适用于 Option[A] -> Option[B]"
我的代码开始如下所示:
此代码编译良好并根据需要工作。
我的问题是:
为什么第一种方法无法编译?
这是否与类型擦除有关,如果是,Functor 的使用如何帮助它?
编译器如何解决这两种情况的隐含?
scala - 如何在 Ammonite REPL 中创建 Scala 演示编译器?
我想在 Ammonite REPL 中创建一个 Scala 演示编译器,但是我总是得到Missing dependency 'object scala in compiler mirror'
.
我已经尝试过在未找到编译器镜像中的对象 scala 中提到的解决方法- 以编程方式运行 Scala 编译器。不幸的是,它不起作用。
如何让它发挥作用?
相同的代码适用于官方 Scala REPL。
scala - 使用惰性参数初始化类时 Scala 编译器的奇怪行为
第一个是正确的 Scala 代码但第二个甚至无法编译的可能性有多大?
编译的那个
这个不能在 Scala 2.11 和 2.12 上编译
scala - 除了在宏中给我源位置之外,-Yrangepos 的作用是什么
所以我用谷歌搜索了一下,但除了稀疏之外没有其他信息:
行。而且我知道如果我想在宏中捕获源片段,我需要使用它。
现在我的两个问题是:
- 为什么默认情况下不启用?
- 使用它是否有任何副作用(例如增加类文件大小)?
scala - 无法推断逆变 Nothing 类型参数
考虑以下代码段:
上述(2.12.3)的编译失败:
如果:
- 与使用不同的类型
Nothing
(例如object Y extends X[String]
) - 该方法
a
未T
在其返回类型中使用(例如def a[T](x: X[T]): Unit = {}
) - 的类型参数
a
是明确给出的(即a[Nothing](Y)
) T
是协变的,而不是逆变的(如果它是不变的,也会失败)
这是编译器中的一些特殊情况Nothing
吗?
作为一个“有趣”的解决方法,以下似乎工作正常:
scala - 清理阶段后的 Scala 编译器输出
一旦Scala编译器完成了所有繁重的工作,我想开发一个工具来对Scala程序进行后处理。据我了解,Scala 编译器的不同阶段在语法糖和 lambda、闭包、模式匹配等高级功能方面逐步简化程序。但是,我注意到所谓的清理阶段产生的结果 -这是代码生成之前的最后一个阶段 - 看起来像 scala,但它不是真正的 scala。
有谁亲自认识或可以向我指出可以帮助我理解清理阶段产生的语言的资源?
举个例子,在清理阶段的输出中,我看到如下内容:
我的假设是,这是翻译模式匹配的结果,但据我所知,它看起来不像有效的 scala 语法(我根本不是一个有经验的 Scala 开发人员!)。
我想这一切都归结为:是否可以将清理阶段的输出转换为一般的有效-可编译-scala代码?
scala - Scala:用于理解类型推断问题的多个 flatMap 定义
我有这样的事情:
上面的代码在 Scala 2.12.4 中编译得很好,但在 Scala 2.11.12 中不能编译:
为什么?我究竟做错了什么??
然后我尝试了:
现在令人惊讶的是,代码可以在 Scala 2.11.12 中编译,但不能在 Scala 2.12.4 中编译!?!
这些是我正在使用的 scalac 标志:
如何编写此代码以便在 Scala 2.11.x 和 2.12.x 中编译而不需要显式类型?
scala - 在scala中,为什么不能从同一范围推断出这个隐式参数?
我正在编写一个简单的 Apache Spark 实用程序,它会根据提供的初始值自动创建一个 AccumulatorV2:
2个隐式参数:canBuildFrom和converter应该分别由隐式函数和编译器预定义的类型转换提供。但是,当我尝试调用它时:
我收到以下错误信息:
为什么 scala 编译器找不到正确的隐式值?我应该怎么做才能解决它?
scala - 使用编译器插件/宏递归包装方法调用
大纲
我有一个看起来像这样的 API:
(ExternalApi
实际上在我的库外部,所以不要修改它)有一系列调用,我想用MyApi.process
调用自动包装,metadata
参数派生自最终类型的T
.
为了说明,要包装的调用可以有任何形式,包括嵌套调用和其他 AST 子树类型(例如Block
s)中的调用,例如:
由于编译器插件“免费”递归地处理 AST 中的匹配结构,因此我决定使用它们。
但是,由于我需要匹配特定的类型签名,因此插件遵循该typer
阶段。
这是 的代码PluginComponent
:
这似乎可以正确解析标识符以及类型,输出例如:
不幸的是,我在编译过程中遇到错误,开始于:
问题
看起来我在用类型定义搞砸了,但它是什么?
具体来说:
在上述要求的限制下,如何正确地用一个调用来包装每个ExternalApi.createX
调用?MyApi.process
笔记
- 鉴于所需的样板数量,我已经建立了一个完整的示例项目。它在这里可用。
- 答案不必定义编译器插件。如果您能够使用宏覆盖所有相关调用,那也很好。
- 最初包装的调用类似于:
def process[T <: TypeConstructor[_ <: SpecialElement] : TypeTag](l: T): T
,这里的设置实际上是一种解决方法。因此,如果您能够生成这种类型的包装调用,即包含运行时的调用TypeTag[T]
,那也很好。
scala - Scala 的类型擦除如何对更高种类的类型参数起作用?
我不明白Scala 删除了哪些泛型类型参数。我曾经认为它应该擦除所有泛型类型参数,但事实并非如此。
如果我错了,请纠正我:如果我在代码中实例化一个 type 的实例Map[Int, String]
,那么在运行时,该实例只知道它是 type Map[_, _]
,并且对它的泛型类型参数一无所知。这就是为什么以下成功编译和执行而没有错误的原因:
现在我希望所有更高种类的类型参数也被删除,也就是说,如果我有一个
我希望类型的实例Foo[Map, Int, String]
对Map
. 但现在考虑以下类型转换“实验”的序列:
这是输出(scala -version 2.12.4):
- 案例 1、3、4 表示
asInstanceOf[Foo[...]]
确实关心Foo
,这是意料之中的。 - 情况2 表示
asInstanceOf[Foo[X,Y]]
不关心和,这也是意料之中的。X
Y
- 情况5 表示
asInstanceOf
不关心更高种类的类型参数,与情况 2 类似,这也是意料之中的。Map
到目前为止,一切都很好。但是,案例 6、7、8 提出了不同的行为:在这里,类型的实例似乎出于某种原因CastTo[Foo, X, Y]
保留了有关泛型类型参数的信息。Foo
更准确地说, aCastTo[Map, Int, Long]
似乎携带了足够的信息来知道字符串不能转换为 a Map
。此外,在案例 8 中,它似乎甚至因为演员阵容Map
而改变。Function
问题):
- 我的理解是否正确,第一个通用参数
CastTo
没有被删除,或者还有其他我看不到的东西?一些隐式操作还是什么? - 是否有任何文档描述了这种行为?
- 我有什么理由想要这种行为吗?我觉得这有点违反直觉,但也许只是我,我使用错误的工具......
谢谢阅读。
编辑:在类似的例子中四处寻找揭示了 2.12.4 编译器的问题(见下面我自己的“答案”),但这是一个单独的问题。