问题标签 [scala-3]
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 是否存在所有类型参数实例化的证据?
给定 Peano 数的以下类型级加法函数
说我们想证明定理
对于所有自然数 n,n + 0 = n
也许可以这样指定
那么在为定理提供证据时,我们可以很容易地要求 Scala 编译器在特定情况下提供证据
但是我们如何询问 Scala 是否可以为 的所有实例生成证据[n <: Nat]
,从而提供 的证明plus_n_0
?
scala - 为什么运算符关联性对于 Scala 3 扩展方法和常规方法的工作方式不同?
当我手动将 Scala 2 代码转换为 Scala 3 时,我的 DSL 的运算符优先级发生了变化,我花了很长时间来调试和修复。似乎处理:
方式不同:
我的心智模型是:
- 对于以 结尾的方法
:
,接收者是右边的东西 - 扩展方法只是方法:就好像方法被添加到类中一样
我的心理模型似乎是错误的。解释正在发生的事情的正确方法是什么?
链接会有所帮助,我检查了 Scala 3 文档并没有找到任何关于自定义运算符如何关联的信息。
更新
我尝试infix
在之前添加关键字def
,但它不会更改此示例中打印的内容。
scala - Scala 3枚举方法覆盖
有没有办法像在 Java 中一样覆盖 Scala 3 枚举中的方法?
我试过这样的事情,但没有结果。也没有在文档中找到任何关于枚举方法覆盖的信息。
也许还有另一种方法可以实现类似的功能?
scala - 在 scala 2 中,可以使用宏或任何语言特性来重写所有子类中的抽象类型具体化机制吗?斯卡拉 3 怎么样?
在 scala 2 中已知宏是严格本地的,并且只在定义类时执行一次。当与抽象类型结合时,这一特性似乎特别弱,因为将抽象类型转换为具体类型的过程通常会绕过宏并使用其自己的原始规则。
下面的测试代码中展示了一个反直觉结果的简单示例:
如果执行,kk的类型变成:
糟糕,类型 AA 完全被忽略了,因为implicitly[TypeTag[this.type]]
它由内置宏隐式支持,该宏仅在定义 BB 时执行一次,而不是在定义 AA 并具体化实际时执行kk.this.type
。我发现它非常笨拙并且容易导致一些其他特性(例如模式匹配、类型 lambda)由于运行时类型擦除而降级。
我想编写/使用语言扩展,例如制作TypeTag[this.type]
AA 的子类型,而不引入运行时开销和超出范围的上下文对象(因此,没有隐含)。我怎样才能以最少的黑客攻击做到这一点?我对编译器扩展和宏等非常核心的解决方案持开放态度,但显然首选可以顺利转移到 scala 3/dotty 的优雅解决方案。
PS 似乎有点“内联/编译时”功能已经部分实现了我的设想。这是正确的印象吗?
scala - Scala 3 联合类型可以“修复” Map[String, Any] 问题吗?
惯用的 Scala 代码尽可能地是类型安全的。结果,反射是不受欢迎的,如果你最终使用Any
静态类型,你就会遇到问题。
例如,流行的 Circe 库可以在没有任何样板的情况下将 aMap[String, String]
或 aMap[String, Int]
转换为 JSON
但是如果你尝试将两者结合起来,你最终会得到 aMap[String, Any]
并且它不能与它一起工作。
在 Scala 3 中,大概类型是Map[String, String | Int]
?
如果是这样,现在是否有可能实现诸如asJson
(可能需要使用宏)之类的方法来确定联合中的每种可能类型都是“可接受的”?
(Circe 的例子只是一个例子,在现实生活中你首先没有这个 Map,而是一个适当的案例类,关于这方面的讨论,请参阅引发这个问题的线程)
scala - 在类型函数中使用匹配类型时证明类型相等的问题
给定
和
这编译(这里没有惊喜):
但是,令人惊讶的是,这不会:
它似乎取决于类型匹配中的案例顺序 - 如果我更改分支的顺序Neg
,Neg [False]
将起作用,但Neg [True]
不会?!
斯卡拉 3.0.0-RC3
编辑:
这按预期工作(Neg
不变):
这个也是:
scala - 如何在同一台机器上设置不同的 Scala 版本?
我想关注关于 Scala[1] 的书,但它使用 Scala 3,并且我安装了 Scala 2。我想同时使用这两个版本,python2
和python3
.
我尝试使用官方源在本地安装 Scala3,但我只能掌握项目级工作目录。sbt
提示不像 REPL 那样工作,我只能使用 Scala 2 打开 REPL(我每次都检查版本)。
鉴于无法卸载 Scala2,如何打开 Scala3 的 REPL?
scala - 当系统同时安装了 Scala2 和 Scala3 时如何执行 Scala3 脚本?
我想使用 Scala3 执行以下脚本:
当我键入命令时scala hello.scala
,我收到以下错误:
我认为这是因为我安装了两个版本的 Scala(2 和 3)。我知道如何为两者启动 REPL(如此处所述),但我无法从命令行执行 Scala3 脚本。
[更新]
我试过scala3-repl hello.scala
了,它只是打开了 REPL:
鉴于我安装了两个不同版本(2 和 3)的 Scala,如何从命令行执行 Scala 3 脚本?
我的操作系统:MacOS
更新 2
正如这个答案中所建议的,我尝试使用它运行amm
并且它适用于一些脚本。但是,以下脚本失败:
脚本:
错误:
在 Scala3-REPL 中运行上述脚本有效:
在仅安装了 Scala3 的系统 (MacOS) 中运行相同的脚本也可以正常工作。
scala - Scala 中的 sortWith 在迭代元组方面是如何工作的?
一个列表可以迭代如下:
上面的代码首先创建一个列表,然后第二个命令创建一个映射,其中包含一个称为“s”的可迭代对象,该映射通过附加字符“y”从“s”创建一个新字符串。
但是,我不明白以下迭代过程:
元组是否一次(s,t)
取两个元素thrill
并比较它们?如何使用此语法/函数准确执行排序?
scala - 构造函数参数在类和案例类中的处理方式不同吗?
在《Programming in Scala 5th Edition》一书中,在第四章中提到,如果一个类是一个案例类,我们可以使用以下方式创建类的对象:
我发现它与以下正常方式没有什么不同:
我尝试在这两种情况下访问对象并且存在差异。当我声明与类相同的case
类时,我可以访问其成员:p.name
,p.age
而如果我尝试对通常声明的类执行相同操作,则会收到以下错误:
就构造对象而言,这两种情况有何不同?