【问题标题】:Understanding Multiple Context Bounds了解多个上下文边界
【发布时间】:2015-04-19 15:02:16
【问题描述】:

查看spire 方法的签名:

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

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

【问题讨论】:

    标签: scala


    【解决方案1】:

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

    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
    

    【讨论】:

    • 其实并不完全等价。当您在复杂内部有一个需要 Manifest[A] 的嵌套类并且您创建 def complex[A : Manifest] 时,它不会提供清单,而如果您这样做 complex[A](implicit mf: Manifest[A]) 我发现它编译得很好。
    猜你喜欢
    • 2020-10-03
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2021-04-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多