【问题标题】:Why does Scala fail to find a secondary implicit value in this one particular case?为什么 Scala 在这种特殊情况下找不到次要的隐式值?
【发布时间】:2012-02-04 04:07:23
【问题描述】:

我很难解释两者之间的行为差​​异 主要隐含值或主隐含值寻求的附加隐含值 隐式转换。具体来说,这是可行的:

trait Foo[A]
implicit def fooString: Foo[String] = null

implicit def value[A](implicit foo: Foo[A]) = 5

> implicitly[Int]
5

但这不是:

implicit def conversion[A](x: Int)(implicit foo: Foo[A]) = new {
    def aMethod = 5
}

> 1.aMethod
could not find implicit value for parameter foo: test.Foo[A]

变化:

  • 搜索是由implicitly启动还是隐式转换
  • 追求的次要隐含值是否是多态的
  • 提供的次要隐式值是否是多态的

我得到以下结果:

Conversion/value  Searching for  Supplied | Works?
----------------  -------------  -------- | ------
     conversion     poly          poly    |  yes
     conversion     poly          mono    |  **no**
     conversion     mono          poly    |  yes
     conversion     mono          mono    |  yes
     value          poly          poly    |  yes
     value          poly          mono    |  yes
     value          mono          poly    |  yes
     value          mono          mono    |  yes

如您所见,唯一不起作用的情况是搜索开始时 通过隐式转换,寻求的值是多态的,但值 提供的是单态的。

这种情况是否有理论上的原因,或者这是一个 Scala 的错误/限制?

【问题讨论】:

    标签: scala polymorphism implicit


    【解决方案1】:

    你被 scalac bug SI-3346 咬了。更一般的看SI-4699的描述,尤其是。第 (1) 点,

    1) 隐式搜索和隐式转换搜索对未确定类型参数的处理方式不同

    您正在直接观察您的案例在哪里区分隐式值和隐式转换。

    我已更新 SI-3346 以包含此作为附加示例。

    【讨论】:

      【解决方案2】:

      通过以下方式更改隐式转换的签名:

      implicit def conversion[A](a: A)(implicit foo: Foo[A]) = new {
      

      然后在定义了隐式值的类型值上调用 aMethod,即使用 String

      scala> "foo".aMethod
      res0: Int = 5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-07
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        • 2016-07-17
        相关资源
        最近更新 更多