繁体   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