了解多个上下文边界

时间:2015-04-19 15:02:17

标签: scala

查看此spire方法的签名:

implicit def complex[A: Fractional: Trig: IsReal: Dist]: Dist[Complex[A]]

[A: Fractional: Trig ...]是什么意思?

2 个答案:

答案 0 :(得分:11)

上下文绑定是断言隐含值存在的一种方式。例如,方法签名:

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

答案 1 :(得分:0)

这是A类型的类型列表。 这意味着该方法要求有四个不同的隐式对象或无参数隐式函数来实现Fractional[A]Trig[A]等。这些类型类提供了将数字视为{{1}所需的所有方法。 } 管他呢。例如,这可能允许从良好的旧Fractional构建复数,而不强迫Double实现任何新的。