4

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)

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)

平等

斯卡拉 2.13

scala> 42 == Some(42)
          ^
       warning: comparing values of types Int and Some[Int] using `==` will always yield false
val res2: Boolean = false

斯卡拉 3

scala> 42 == Some(42)
1 |42 == Some(42)
  |^^^^^^^^^^^^^^
  |Values of types Int and Some[Int] cannot be compared with == or !=
4

2 回答 2

5

因此,对于您的Equality示例,它实际上是由新的Multiversal Equality引起的,这几乎意味着如果您有一个Eql[A, B]where A is B 那么类型 A 只能与它具有Eql它们的实例的事物(形式为Eql[A, C]or Eql[C, A])进行比较。

就 scala 3 的一般类型推断而言,主要是:

  • 联合类型:我们现在可以表示联合类型和表达式,如

     if (condition) 1 else "1"
    

    应该推断为 type Int | String

  • 显式 Null:联合类型的新用途之一是描述可空类型的一种方式,因此例如我们可以在 Java 中编写这样的代码:

     public String getUser(int id) {
         if (id == 0) {
             return "Admin";
         }
         return null;
     }
    

    而且在 scala 2 中我们也可以这样写:

    def getUser(id: Int): String = if (id == 0) return "Admin" else null
    

    但是在 scala 3 中,这样的方法也必须声明为 typeString | Null以表示其可空性,并且默认情况下不会在 scala 3 的较新版本中编译。

    使用 Java 时会变得更加复杂,因此如果您想了解更多信息,我建议您阅读链接。

  • GADT:类似于@functionalInterface在 java 中的工作方式,我们知道有 GADT。这意味着,如果您要具有一个未实现方法的特征:

    trait Fooable {
        def foo(): Unit
    }
    

    您可以通过传递带有该签名的 lambda 来创建它的实例,因此在此示例中:

    val fooable: Fooable = () => print("Fooing")
    

    还有一些,包括Context FunctionsImplicit ConversionsParameter untupling,但这些是主要的。

于 2020-06-02T12:14:46.667 回答
2

推断类型现在通过单个参数列表的其余部分传播,这意味着可能不需要使用多个参数列表来辅助推断。

斯卡拉 2.13

scala> def f[T](i: T, g: T => T) = g(i)
def f[T](i: T, g: T => T): T

scala> f(41, x => x + 1)
             ^
       error: missing parameter type

斯卡拉 3

scala> def f[T](i: T, g: T => T) = g(i)
def f[T](i: T, g: T => T): T

scala> f(41, x => x + 1)
val res0: Int = 42

我猜这个更改可能与Allow inter-parameter dependencies #2079有关


当类型参数没有以术语出现时更好的推理

斯卡拉 2.13

scala> def f[F <: List[A], A](as: F) = as
def f[F <: List[A], A](as: F): F

scala> f(List(42))
       ^
       error: inferred type arguments [List[Int],Nothing] do not conform to method f's type parameter bounds [F <: List[A],A]
             ^
       error: type mismatch;
        found   : List[Int]
        required: F

斯卡拉 3

scala> def f[F <: List[A], A](as: F) = as                                                                                                                
def f[F <: List[A], A](as: F): F

scala> f(List(42))                                                                                                                                       
val res0: List[Int] = List(42)
于 2020-06-03T23:43:14.117 回答