标签: scala-3

当 A 显然是单例时,“A 没有可用的单例值”

我不明白为什么这段代码不能编译并失败:

没有可用于 A 的单例值,
其中: A 是具有约束的类型变量 >: ("yo" : String) 和 <: Singleton

case class Wrapper[A <: Singleton](a: A)(using ValueOf[A])

def test[A <: Singleton](blabla: Wrapper[A]): Unit = ()

test(Wrapper("yo"))
Run Code Online (Sandbox Code Playgroud)

这是预期的还是 Scala 3 中的错误?

请注意,如果我提取Wrapper("yo")然后它的工作原理:

case class Wrapper[A <: Singleton](a: A)(using ValueOf[A])

def test[A <: Singleton](blabla: Wrapper[A]): Unit = ()

val value = Wrapper("yo")
test(value)
Run Code Online (Sandbox Code Playgroud)

scala scala-3

6
推荐指数
0
解决办法
97
查看次数

Understanding definition and desugaring of "Option" in Scala 3 book

I'm starting a Scala role in a few weeks yet I haven't written any Scala before (yes, my future employers know this), although I've written a lot of C# and Haskell. Anyway I was skimming through the Scala 3 book, and found this example:

enum Option[+T]:
  case Some(x: T)
  case None
Run Code Online (Sandbox Code Playgroud)

Which apparently dusugars into:

enum Option[+T]:
  case Some(x: T) extends Option[T]
  case None       extends Option[Nothing]
Run Code Online (Sandbox Code Playgroud)

My two questions are:

  1. How exactly does the mechanism of this desugaring work? …

scala scala-3

6
推荐指数
1
解决办法
87
查看次数

类型类 + 内联方法是否未定义?

以下代码的输出只是list(没有打印数字)。

trait TC[A]:
  inline def show(value: A): Unit

object TC:
  given TC[Int] with
    inline def show(value: Int): Unit = println(value)
  given[A:TC]: TC[List[A]] with
    inline def show(value: List[A]): Unit =
      println("list")
      value.foreach(x => summon[TC[A]].show(x))

@main
def main: Unit =
  import TC._
  val value = 1 :: 2 :: 3 :: Nil
  summon[TC[List[Int]]].show(value)
Run Code Online (Sandbox Code Playgroud)

如果我删除,inline那么一切都会好起来的。我是否在调用未定义的行为?

scala typeclass scala-3

6
推荐指数
0
解决办法
66
查看次数

隐含和召唤有什么区别?

在 Scala 3 中summon似乎和旧的implicitly. 但是当我们深入研究实际例子时,我们发现情况并非如此。例如

case class A(i: Int, s: String)

val mirror    = implicitly[Mirror.Of[A]]    
type ValueOfs = Tuple.Map[mirror.MirroredElemLabels, ValueOf]
val valueOfs  = summonAll[ValueOfs]

def values(t: Tuple): Tuple = t match
  case (h: ValueOf[_]) *: t1 => h.value *: values(t1)
  case EmptyTuple => EmptyTuple
Run Code Online (Sandbox Code Playgroud)

产生错误

cannot reduce inline match with  
 scrutinee:  compiletime.erasedValue[App.ValueOfs] : App.ValueOfs  
 patterns :  case _:EmptyTuple  
             case _:*:[t @ _, ts @ _]
Run Code Online (Sandbox Code Playgroud)

但是替换implicitly[Mirror.Of[A]]summon[Mirror.Of[A]]编译很好。

在这种情况下和一般情况下summonvs的微妙之处是什么implicitly

scala implicit scala-3

6
推荐指数
1
解决办法
80
查看次数

在 Scala 3 中,有没有办法在一个区域中禁用 -language:strictEquality(多元平等)?

想要这样做的特殊原因是仍然能够对来自超类的值使用模式匹配。例如,我希望case None在查看 type 的值时能够匹配Option[Throwable],但这似乎不可能,因为Throwable不可能,而且(我想)永远不会有CanEqual实例。

scala scala-3

6
推荐指数
1
解决办法
50
查看次数

Scala 3 匹配类型缩减

假设我想使用这样的匹配类型来表示一个向量:

\n
type V[I <: Int, N] = I match\n  case 2 => (N, N)\n  case 3 => (N, N, N)\n  case 4 => (N, N, N, N)\n
Run Code Online (Sandbox Code Playgroud)\n

所以现在我可以使用元组声明我的向量:

\n
  val v2: V[2, Int] = (2, 2)\n  val v3: V[3, Int] = (3, 3, 3)\n  val v4: V[4, Int] = (4, 4, 4, 4)\n
Run Code Online (Sandbox Code Playgroud)\n

然后我可以定义一个元组矩阵和一个元组方阵:

\n
type Mx[L <: Int, C <: Int, N] = V[L, V[C, N]]\ntype Mxq[T <: Int, N] = Mx[T, T, N]\ntype M3I = …
Run Code Online (Sandbox Code Playgroud)

scala singleton-type scala-3 match-types

6
推荐指数
0
解决办法
239
查看次数

无法在 ScalaDoc (Scala 3) 中添加包描述

我无法使用 Scala 3 在 ScalaDoc 中添加包描述

/** package description */
package foo {
    /** some scaladoc comment */
    def method():A = ???
}
Run Code Online (Sandbox Code Playgroud)

然后我用 sbt (1.5.3) 生成文档

sbt> doc
Run Code Online (Sandbox Code Playgroud)

我没有在文件中获得包本身的描述,而只获得包内部index.html的描述。method

scala scaladoc scala-3

5
推荐指数
1
解决办法
119
查看次数

Scala 3:仅针对某些类型发生相等编译错误

我试图理解 Scala3 新的“多元平等”功能。在比较不同类型时,我遇到了不一致的行为。

情况 1. 比较 Int 和 String:

  val x = 1
  val y = "One"

  x == y  // gives compilation error -> "Values of types Int and String cannot be compared with == or !="
Run Code Online (Sandbox Code Playgroud)
  • 即使不导入也编译错误scala.language.strictEquality
  • 在 Scala2 中编译没有任何错误

案例 2. 比较两个案例类:

  case class Cat(catname: String)
  case class Dog(dogname: String)
  val d = Dog("Frank")
  val c = Cat("Morris")

  d == c  // false, but it compiles
Run Code Online (Sandbox Code Playgroud)

我知道我需要import scala.language.strictEquality在 case2 中强制执行多重平等。但为什么 case1 不需要呢?

scala scala-3

5
推荐指数
1
解决办法
226
查看次数

Scala 3 隐式转换:比较值和文字

我有一个不透明类型,它是通过在伴生对象范围中FancyDouble使用从 Double 隐式转换的。given Conversion[Double, FancyDouble] = FancyDouble(_)之后,构造val d: FancyDouble = 0.0工作,但是当我尝试进行类似的比较时if (d == 0.0),编译器抱怨我无法比较FanceDoubleand Double(我期望它应该将0.0文字隐式转换为 FancyDouble,就像前面的情况一样。

如何启用与隐式转换的比较?

scala implicit-conversion scala-3

5
推荐指数
1
解决办法
203
查看次数

如何从 Scala3 枚举中随机选择元素

我的问题很简单。我有以下内容:

enum Colors:
  case Blue, Red, Green
Run Code Online (Sandbox Code Playgroud)

我如何从这个枚举中选择一个随机元素?我尝试了这个问题的解决方案,但没有成功。

random enums scala scala-3

5
推荐指数
1
解决办法
219
查看次数