Scala 为什么要使用类型T=<;类型>;而不是特质[T]?

Scala 为什么要使用类型T=<;类型>;而不是特质[T]?,scala,Scala,这是我在Scala编程中得到的一个观察结果 在Scala中,我经常看到抽象的特质模式: trait Abstract { type T def transform(x: T): T val initial: T var current: T } class Concrete extends Abstract { type T = String def transform(x: String) = x + x val initial = "hi" var curr

这是我在Scala编程中得到的一个观察结果

在Scala中,我经常看到抽象的特质模式:

trait Abstract {
  type T
  def transform(x: T): T
  val initial: T
  var current: T
}

class Concrete extends Abstract {
  type T = String
  def transform(x: String) = x + x
  val initial = "hi"
  var current = initial
}
为什么我会选择抽象特征模式而不是参数化泛型

trait Abstract[T] {
  def transform(x: T): T
  val initial: T
  var current: T
}

class Concrete extends Abstract[String]{
  def transform(x: String): x + x
  val initial: "hi"
  var current: initial
}

这两种方法大致相当。我们可能更喜欢类型成员的一个原因是,可以使用依赖类型编写方法,而不必是泛型的:

def doSomethingWith(a: Abstract): a.T = ...
可以说比

def doSomethingWith[T](a: Abstract[T]): T = ...
至少当签名变得更复杂时(特别是当我们在进行类型级编程时,使用
抽象
作为类型级函数)

类型推断也可能有暗示;我不知道scala类型推断是如何工作的,但据我所知,无法部分指定函数的类型:

def functionWeWantToCall[U, V, W](a: Abstract[U], b: Abstract[V], c: Abstract[W])
functionWeWantToCall[String, _, _](x, y, z) //won't compile

def functionWeWantToCall(a: Abstract, b: Abstract, c: Abstract)
functionWeWantToCall(x: Abstract{type T = String}, y, z) //works
这就是我有时会使用类型成员方法的原因


当然,有些人(例如,有ML背景的人)只是觉得类型成员方法更为熟悉或可读。

是的,Scala中的类型推断是一种奇怪的怪兽。有时,使用类型参数的推理比使用类型成员的推理更有效。在Dotty(新的Scala编译器)中,这两个概念是统一的,因此希望在类型推断方面不会有任何区别。上次我在讨论之后,担心的是它已经“统一”了,而支持了效果不太好的东西:/。可能重复