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