[英]Why can method parameter F have the same name as type constructor F?
我正在看 John De Goes “FP to the Max”視頻。 在代碼中,他做了這樣的事情來獲取隱式對象:
object Program {
def apply[F[_]](implicit F: Program[F]): Program[F] = F
}
這是否意味着變量名 F ( implicit F: Program[F]
的第一個)實際上是一個不同的F
? 這很令人困惑。 他的意思是:
object Program {
def apply[F[_]](implicit ev: Program[F]): Program[F] = ev
}
如何編譯知道F
他是指在返回的F
? 類型構造函數還是作用域中的變量?
事實上,函數參數T
不同於類型參數T
,例如
def f[T](T: T): T = T
f(42) // res0: Int = 42
編譯器不會混淆,因為值與類型存在於不同的宇宙中:
...存在兩個獨立的宇宙,類型的宇宙和值的宇宙。 在值的世界中,我們有一些方法將值作為圓括號(或偶爾花括號)中的參數。 在類型的世界中,我們有類型構造函數,它將類型作為方括號中的參數。
在處理類型類時有時會使用此約定。 它旨在傳達我們想要簡單地返回為F
解析的類型類實例。 為避免混淆,您可以使用您已經建議的ev
方法,甚至
object Program {
def apply[F[_]: Program]: Program[F] = implicitly[Program[F]]
}
作為旁注,這個在 typeclass 的伴生對象中使用apply
方法的技巧允許我們避免implicitly
使用,例如,給定
trait Foo[T]
trait Bar[T]
trait Program[F[_]]
implicit val fooProgram: Program[Foo] = ???
implicit val barProgram: Program[Bar] = ???
object Program {
def apply[F[_]: Program]: Program[F] = implicitly
}
然后我們可以寫
Program[Bar]
代替
implicitly[Program[Bar]]
如何編譯知道
F
他是指在返回的F
? 類型構造函數還是作用域中的變量?
編譯器知道一個方法/函數只能返回一個值。 所以=
后面的有一個類型但不是一個類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.