为什么没有找到隐式视图,当eta转换和指定类型参数确实允许找到隐式视图时?

时间:2016-11-17 14:47:29

标签: scala implicit

代码:

fails

在此示例中,只有compiles1方法无法编译。错误消息是:

  

错误:(23,16)A =>中没有可用的隐式视图B.       future.map(从)

我很困惑为什么没有发现隐含的观点。基于成功编译的compiles2compilesN方法,似乎 可以从A =>获得隐式视图。乙

这里发生了什么,为什么两个fails方法有效,但{{1}}没有?

我的背景:我还在学习Scala,所以我很容易就会错过一些非常明显的东西。 :)

我在Scala 2.11.8上。

1 个答案:

答案 0 :(得分:6)

编译器尝试在from的eta扩展到函数之前解决implicits,所以当你这样调用它时,from的类型参数还没有被推断出来:

future.map(from)

compiles2显然有效,因为您自己提供类型参数。当你调用future.map(from[C1, C2])时,编译器知道它需要一个隐式的C1 => C2,因为那是你所说的。

使用compiles1,差异会更加微妙,但它源于future.map(from)future.map(x => from(x))实际上是非常不同的事实。前者使用eta扩展,由于上述原因而失败。使用future.map(x => from(x))时,不会发生eta扩展。相反,你有一个匿名函数,只需调用 from而不是eta扩展它。因此,编译器可以推断x的类型,它告诉我们xC1(在这种情况下),它可以找到隐式转换c1ToC2在解析方法的隐式和最终返回类型from时,满足Future[C2]的类型参数。