簡體   English   中英

我為什么要使用類型T = <type> 而不是特征[T]?

[英]Why would I use type T = <type> instead of trait[T]?

這是我從《 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 = ...

至少隨着簽名變得更加復雜(特別是如果我們在進行類型級編程時,使用Abstract作為類型級函數)。

類型推斷可能還會有一些含義。 我不知道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背景的人)只是覺得類型成員方法更熟悉或更易讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM