【发布时间】:2015-04-19 15:02:16
【问题描述】:
查看spire 方法的签名:
implicit def complex[A: Fractional: Trig: IsReal: Dist]: Dist[Complex[A]]
[A: Fractional: Trig ...]是什么意思?
【问题讨论】:
标签: scala
查看spire 方法的签名:
implicit def complex[A: Fractional: Trig: IsReal: Dist]: Dist[Complex[A]]
[A: Fractional: Trig ...]是什么意思?
【问题讨论】:
标签: scala
上下文绑定是一种断言隐含值存在的方式。比如方法签名:
def complex[A : Fractional]
意味着当方法被调用时,范围内必须有一个Fractional[A] 类型的值可用(这样方法体就可以使用implicitly[Fractional[A]] 来获取该类型的实例)。如果编译器没有这一事实的证据,编译将失败。上下文边界实际上是语法糖,所以上面的方法签名相当于:
def complex[A](implicit ev: Fractional[A])
多个上下文边界仅仅意味着我们对泛型参数做出多个这样的断言:
def complex[A : Fractional : Trig]
表示调用该方法时,范围内必须有Fractional[A] 和 Trig[A] 类型的值。所以这个方法签名相当于:
def complex[A](implicit ev0: Fractional[A], ev1: Trig[A])
当您使用上下文绑定语法声明方法时,您可以在 REPL 中看到这一切:
trait Foo[A]
trait Bar[A]
def foo[A : Foo : Bar] = ???
// foo: [A](implicit evidence$1: Foo[A], implicit evidence$2: Bar[A])Nothing
【讨论】:
def complex[A : Manifest] 时,它不会提供清单,而如果您这样做 complex[A](implicit mf: Manifest[A]) 我发现它编译得很好。