簡體   English   中英

較高的kinded類型與泛型

[英]Higher kinded types vs generics

我正在閱讀Scala中更高級的類型,我不能圍繞下划線的使用。

例如:

trait Functor[F[_]] {
  def map[A, B](fa: F[A])(f: A => B) : F[B]
}

val listFunctor = new Functor[List] {
  override def map[A, B](fa: List[A])(f: A => B) = fa.map(f)
}

listFunctor.map(List(1,2,3))(_ + 3)

如果我在特征中使用參數化類型A,我會得到相同的結果:

trait Functor2[F[A]] {
  def map[A, B](fa: F[A])(f: A => B) : F[B]
}

val listFunctor2 = new Functor2[List] {
  override def map[A, B](fa: List[A])(f: A => B) = fa.map(f)
}

listFunctor2.map(List(1,2,3))(_ + 3)

這兩個例子之間有顯着差異嗎?

這兩種方式之間沒有區別,表明Functor2是在類型構造函數上進行參數化的。 如果您注意到,在后一種情況下, A只是一個占位符,因為它尚未在其他地方聲明。

我通常更喜歡使用F[_]語法,因為它澄清了我們想要一個類型構造函數,並且我們在類中引用的占位符和類型之間的命名中沒有意外重疊:在后一種情況下,即使它們碰巧發生在指的是同一類型的參數,有之間沒有強制約束A在構造函數簽名和Amap方法簽名,這也可能會導致一些混亂關於兩者的性質A以及它們如何與每個其他。

暫無
暫無

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

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