我不明白为什么这段代码不能编译并失败:
没有可用于 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) 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:
以下代码的输出只是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 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]]
编译很好。
在这种情况下和一般情况下summon
vs的微妙之处是什么implicitly
?
想要这样做的特殊原因是仍然能够对来自超类的值使用模式匹配。例如,我希望case None
在查看 type 的值时能够匹配Option[Throwable]
,但这似乎不可能,因为Throwable
不可能,而且(我想)永远不会有CanEqual
实例。
假设我想使用这样的匹配类型来表示一个向量:
\ntype 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然后我可以定义一个元组矩阵和一个元组方阵:
\ntype 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 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
我试图理解 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
案例 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 不需要呢?
我有一个不透明类型,它是通过在伴生对象范围中FancyDouble
使用从 Double 隐式转换的。given Conversion[Double, FancyDouble] = FancyDouble(_)
之后,构造val d: FancyDouble = 0.0
工作,但是当我尝试进行类似的比较时if (d == 0.0)
,编译器抱怨我无法比较FanceDouble
and Double
(我期望它应该将0.0
文字隐式转换为 FancyDouble,就像前面的情况一样。
如何启用与隐式转换的比较?
我的问题很简单。我有以下内容:
enum Colors:
case Blue, Red, Green
Run Code Online (Sandbox Code Playgroud)
我如何从这个枚举中选择一个随机元素?我尝试了这个问题的解决方案,但没有成功。