[英]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
在構造函數簽名和A
在map
方法簽名,這也可能會導致一些混亂關於兩者的性質A
以及它們如何與每個其他。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.