标签: scala-3

如何从 Visual Studio Code UI 执行 dotty 代码

我正在尝试使用Visual Studio Code来运行 dotty 代码。我开始使用IDEsbt launchIDE根据来自指令这个页面,我也安装Dotty Language ServerCode Runner扩展。Dotty 是使用安装的brew,我可以从 CMD 编译和执行 dotty 代码。

问题是我无法运行此代码,Visual Studio Code因为我Code Runner试图使用 scala 而不是 dotty 来执行它。

找不到任何有用的配置来调整此插件以使用 dotty。

有什么方法可以让它从 Visual Studio Code UI 工作吗?

scala dotty visual-studio-code scala-3

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

如何确保元组是同质的?

由于我无法控制的原因,我的方法以元组的形式接收输入。这个元组应该只包含 的实例Foo,即它应该看起来像(Foo, Foo ... Foo)并且不应该有StringInt在里面。我想在编译时检查这个而不是在运行时抛出异常。我怎样才能做到这一点?

以下是我目前拥有的代码,这是不对的:

def f(tupleOfFoos: Tuple): Tuple = {
  for (x <- tupleOfFoos) assert(x.isInstanceOf[Foo])
  mapTuple(tupleOfFoos, irrelevantFunction)
}
Run Code Online (Sandbox Code Playgroud)

我愿意使用 Shapeless 或 Dotty/Scala 3 中引入的新功能。

scala tuples dotty scala-3

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

如何询问 Scala 是否存在所有类型参数实例化的证据?

给定以下 Peano 数的类型级加法函数

sealed trait Nat
class O extends Nat
class S[N <: Nat] extends Nat

type plus[a <: Nat, b <: Nat] = a match
  case O => b
  case S[n] => S[n plus b]
Run Code Online (Sandbox Code Playgroud)

说我们想证明定理

对于所有自然数 n,n + 0 = n

也许可以这样指定

type plus_n_0 = [n <: Nat] =>> (n plus O) =:= n
Run Code Online (Sandbox Code Playgroud)

那么在为定理提供证据时,我们可以很容易地向 Scala 编译器询问特定情况下的证据

summon[plus_n_O[S[S[O]]]]  // ok, 2 + 0 = 2
Run Code Online (Sandbox Code Playgroud)

但是我们如何询问 Scala 是否可以为 的所有实例生成证据[n <: Nat],从而提供 的证明plus_n_0

scala implicit scala-3

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

如何在 Scala 3 / Dotty 中实现像 MapK 这样的类型?

我正在尝试但未能让这样的东西在 Scala 3 中工作:

type TupleK[K[*], V[*], A] = (K[A], V[A]) 

final class MapK[K[*], V[*]] private (val rawMap: Map[K[?], V[?]]) {
    
  def foreach(f: TupleK[K, V, ?] => Unit): Unit = {
    rawMap.foreach(f.asInstanceOf[Tuple2[K[?], V[?]] => Any])
  }
}

object MapK {
  
  def apply[K[*], V[*]](entries: TupleK[K, V, ?]*): MapK[K, V] = {
    new MapK[K, V](Map(entries: _*))
  }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用:

class Key[A]()
  
type Id[A] = A
  
val intKey = Key[Int]
val strKey = Key[String]

MapK[Key, Id](intKey -> 1, strKey -> "a")
Run Code Online (Sandbox Code Playgroud)

在 Scala …

scala existential-type dotty higher-kinded-types scala-3

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

类型类:不使用`asInstanceOf`,但仍然得到`ClassCastException`

考虑以下相对简单的代码:

import scala.deriving.Mirror

trait TC[A]:
  def show: A
object TC:
  inline def derived[A](using m: Mirror.ProductOf[A]): TC[A] = new TC[A]:
    override def show: A =
      val p: Product = new Product:
        def canEqual(that: Any): Boolean = true
        def productArity: Int = 1
        def productElement(n: Int): Any = 1
      m.fromProduct(p)

sealed trait T
case class C(x: Int) extends T derives TC
case object C // If I remove this line, then no exception will be thrown

@main
def main: Unit =
  println(summon[TC[C]].show) …
Run Code Online (Sandbox Code Playgroud)

scala typeclass scala-3

5
推荐指数
0
解决办法
50
查看次数

如何使用 Coursier 在命令行中运行 Scala 3 应用程序

如果您按照官方 Scala 3 站点(如DottyScala Lang)上的步骤进行操作,那么它建议使用 Coursier 安装 Scala 3。问题在于,这些都没有解释在执行这些步骤后如何运行已编译的 Scala 3 应用程序。

斯卡拉 2:

> cs install scala
> scalac HelloScala2.scala
> scala HelloScala2
Hello, Scala 2!
Run Code Online (Sandbox Code Playgroud)

斯卡拉 3:

> cs install scala3-compiler
> scala3-compiler HelloScala3.scala
Run Code Online (Sandbox Code Playgroud)

现在如何使用 Scala 3 运行编译的应用程序?

scala coursier scala-3

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

类型类派生访问默认值

使用镜像在 Scala 3 中执行类型类派生时,是否有一种干净的方法来访问案例类字段的默认值?例如:

case class Foo(s: String = "bar", i: Int, d: Double = Math.PI)
Run Code Online (Sandbox Code Playgroud)

Mirror.Product.MirroredElemLabels将被设置为("s", "i", "d")。有没有类似的东西:(Some["bar"], None, Some[3.141592653589793])

如果不能,这可以使用宏来实现吗?我可以同时使用镜像和宏来派生类型类实例吗?

scala typeclass scala-macros generic-derivation scala-3

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

Scala 3 中的类型推断变化

Scala 3 将在类型推断方面带来哪些变化?当前文档只是说明TODO。例如,

弱一致性

斯卡拉 2.13

scala> val i: Int = 42
val i: Int = 42

scala> val c: Char = 'a'
val c: Char = a

scala> List(i,c)
val res0: List[Int] = List(42, 97)
Run Code Online (Sandbox Code Playgroud)

Scala 3 (dotty 0.24.0-RC1)

scala> val i: Int = 42
val i: Int = 42

scala> val c: Char = 'a'
val c: Char = a

scala> List(i,c)
val res0: List[AnyVal] = List(42, a)
Run Code Online (Sandbox Code Playgroud)

平等

斯卡拉 2.13

scala> 42 == Some(42) …
Run Code Online (Sandbox Code Playgroud)

scala type-inference dotty scala-3

4
推荐指数
1
解决办法
342
查看次数

如何使用匹配类型实现 SKI 组合器演算?

我试图使用匹配类型在 Dotty 中实现SKI 组合器演算

SKI 组合子演算的快速描述:

  • S, K, 和I是项
  • (xy)是一个术语 ifx并且y是术语并且就像函数应用程序
  • (((Sx)y)z)(与 相同Sxyz)返回xz(yz)(与 相同(xz)(yz)
  • ((Kx)y)(同Kxy)返回x
  • (Ix) 返回 x

以下是我使用的(R尽可能减少术语)。一个术语(xy)被写成一个元组(x,y)SK, 和I是特征。

trait S
trait K
trait I

type R[T] = T match {
  case (((S,x),y),z) => R[((x,z),(y,z))]
  case ((K,x),y) => R[x]
  case (I,x) => R[x]
  case (a,b) …
Run Code Online (Sandbox Code Playgroud)

types scala pattern-matching dotty scala-3

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

为什么自我注释的特征不能分配给自我类型?

trait Base

trait Plugin { base: Base =>
    def asBase: Base & Plugin = this
}

class Mix extends Base, Plugin

val plug: Plugin = new Mix
val baseA: Base= plug.asBase
val baseB: Base = plug // snorts with "Found: Plugin. Required: Base
Run Code Online (Sandbox Code Playgroud)

为什么?如果我是正确的,则遵守里氏替换原则,因为 的所有实例Plugin都是具体类型,该类型是包含 的子类型的混合Base。因此,Base可以用type的对象替换type的对象Plugin,而不影响程序的正确性。

scala scala-3

4
推荐指数
1
解决办法
76
查看次数