我参加了Martin Odersky关于Scala未来的主题演讲:
https://skillsmatter.com/skillscasts/8866-from-dot-to-dotty
在1:01:00,对观众问题的回答似乎表明未来的Scala将不会是图灵完整的.
我理解正确吗?Scala 3将不再是图灵完整吗?如果是这样,对于像我这样每天在工作中使用Scala解决实际问题的人会产生什么样的实际影响呢?换句话说,工业Scala程序员松散了什么,他们通过删除图灵完整性获得了什么?
我使用Dotty模板创建了一个基本的Scala Dotty项目,并将该项目导入Intellij IDE。
当我使用sbt
命令行时,一切正常。
当我尝试在Intellij IDE中构建或运行它时,出现以下错误:
Error:scalac: Multiple 'scala-library*.jar' files (scala-library-0.9.0-RC1.jar, scala-library-2.12.6.jar) in Scala compiler classpath in Scala SDK sbt: ch.epfl.lamp:dotty-library_0.9:0.9.0-RC1:jar
任何想法如何解决这个问题?
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 Get[A]
是我们的高级类型。还有一个 Get's: 元组(Get[String],Get[Int])
以及来自(String,Int) => Person
.
Scala-3 有一个名为 InverseMap 的匹配类型,它将类型 (Get[String], Get[Int]) 转换为本质上的类型 (String,Int)。
所以最终目标是编写一个函数,它可以接受一个任意数量Get[_]
类型的元组和一个输入与 InserveMap 类型匹配的函数,并最终返回 a Get[_]
,其中包装的类型是函数的结果。
我试图创建一个genericF
在下面调用的函数来显示所需的行为,尽管它可能不正确——但我认为它至少显示了正确的意图。
case class Person(name: String, age: Int)
trait Get[A] {
def get: A
}
case class Put[A](get: A) extends Get[A]
val t: (Get[String], Get[Int]) = (Put("Bob"), Put(42))
val fPerson: (String,Int) => Person = Person.apply _
def genericF[T<:Tuple,I<:Tuple.InverseMap[T,Get],B](f: I => B, t: T): Get[B] = ???
val person: Get[Person] = …
Run Code Online (Sandbox Code Playgroud) 学习 Scala3 扩展和 CanEqual 概念,但发现扩展 Int 的某些特性有困难。
在以下示例中,我可以轻松地向 Int 添加 >= 功能以将其与 RationalNumber 案例类进行比较,但无法修改 == 的行为。(注 1~2 与 RationalNumber(1,2) 相同)。
这个问题似乎与基本的 AnyVal 类型以及 Scala 如何传递给 Java 来处理 equals 和 == 相关。
case class RationalNumber(val n: Int, val d: Int):
def >=(that:RationalNumber) = this.num * that.den >= that.num * this.den
//... other comparisons hidden (note not using Ordered for clarity)
private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)
val sign = …
Run Code Online (Sandbox Code Playgroud) 我正在查看页面Dotty
下的文档Contextual Abstractions
,我看到了Given Instances
.
给定实例(或简单地说,“给定”)定义了某些类型的“规范”值,用于将参数合成给给定的子句。例子:
trait Ord[T] {
def compare(x: T, y: T): Int
def (x: T) < (y: T) = compare(x, y) < 0
def (x: T) > (y: T) = compare(x, y) > 0
}
given intOrd: Ord[Int] {
def compare(x: Int, y: Int) =
if (x < y) -1 else if (x > y) +1 else 0
}
given listOrd[T]: (ord: Ord[T]) => Ord[List[T]] {
def compare(xs: List[T], ys: List[T]): Int = …
Run Code Online (Sandbox Code Playgroud) 我正在阅读 Scala 3 文档。他们引入了given
关键字,被认为是 Scala 2 的替代品implicit
。代码在这里
trait Ord[T] {
def compare(x: T, y: T): Int
def (x: T) < (y: T) = compare(x, y) < 0
def (x: T) > (y: T) = compare(x, y) > 0
}
given intOrd: Ord[Int] {
def compare(x: Int, y: Int) =
if (x < y) -1 else if (x > y) +1 else 0
}
given listOrd[T]: (ord: Ord[T]) => Ord[List[T]] {
def compare(xs: List[T], ys: List[T]): Int …
Run Code Online (Sandbox Code Playgroud) 我尝试在 WriterT 上使用 flatMap 并且成功了。
所以问题可能出在我的类型上,但我找不到它有什么问题。
import cats.Monad
import cats.syntax.flatMap._
object Main extends App {
type Optional[A] = A | Null
val maybeInt1: Optional[Int] = 1
val maybeInt2: Optional[Int] = null
given Monad[Optional] with {
def pure[A](x: A): Optional[A] = x
def flatMap[A, B](fa: Optional[A])(f: A => Optional[B]): Optional[B] = {
fa match {
case null => null
case a: A => f(a)
}
}
def tailRecM[A, B](a: A)(f: A => Optional[Either[A, B]]): Optional[B] = {
f(a) match {
case …
Run Code Online (Sandbox Code Playgroud) 有什么限制是我们应该注意的吗?它是否需要我们使用一些类似 scalafix 的工具?或者它会开箱即用吗?