我正在尝试使用Visual Studio Code
来运行 dotty 代码。我开始使用IDEsbt launchIDE
根据来自指令这个页面,我也安装Dotty Language Server
和Code Runner
扩展。Dotty 是使用安装的brew
,我可以从 CMD 编译和执行 dotty 代码。
问题是我无法运行此代码,Visual Studio Code
因为我Code Runner
试图使用 scala 而不是 dotty 来执行它。
找不到任何有用的配置来调整此插件以使用 dotty。
有什么方法可以让它从 Visual Studio Code UI 工作吗?
由于我无法控制的原因,我的方法以元组的形式接收输入。这个元组应该只包含 的实例Foo
,即它应该看起来像(Foo, Foo ... Foo)
并且不应该有String
或Int
在里面。我想在编译时检查这个而不是在运行时抛出异常。我怎样才能做到这一点?
以下是我目前拥有的代码,这是不对的:
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 中引入的新功能。
给定以下 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 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 …
考虑以下相对简单的代码:
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 3 站点(如Dotty或Scala 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 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 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) 我试图使用匹配类型在 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)
,S
,K
, 和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) 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
,而不影响程序的正确性。