簡體   English   中英

為什么方法參數 F 可以與類型構造函數 F 同名?

[英]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.

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