微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

隐式参数的顺序在Scala中是否重要?

给出一些方法

def f[A,B](p: A)(implicit a: X[A,B],b: Y[B])

隐式参数列表中前缀b的顺序对类型推断是否重要?

我认为只有不同参数列表中的参数放置很重要,例如类型信息仅从左到右通过参数列表流动.

我问,因为我注意到在单隐式列表中更改隐式参数的顺序使得我的程序编译.

真实的例子

以下代码使用:

>无形2.1.0
> Scala 2.11.5

这是一个简单的sbt构建文件,以帮助编译示例:

scalaVersion := "2.11.5"

libraryDependencies += "com.chuusai" %% "shapeless" % "2.1.0"

scalaSource in Compile := baseDirectory.value

在这个例子上.此代码编译:

import shapeless._
import shapeless.ops.hlist.Comapped

class Foo {
  trait NN
  trait Node[X] extends NN
  object computation {
    def foo[LN <: HList,N <: HList,TupN <: Product,FunDT]
    (dependencies: TupN)
    (computation: FunDT)
    (implicit tupToHlist: Generic.Aux[TupN,LN],unwrap: Comapped.Aux[LN,Node,N]) = ???
//    (implicit unwrap: Comapped.Aux[LN,N],tupToHlist: Generic.Aux[TupN,LN]) = ???

    val ni: Node[Int] = ???
    val ns: Node[String] = ???
    val x = foo((ni,ns))((i: Int,s: String) => s + i.toString)
  }
}

这段代码失败了

import shapeless._
import shapeless.ops.hlist.Comapped

class Foo {
  trait NN
  trait Node[X] extends NN
  object computation {
    def foo[LN <: HList,FunDT]
    (dependencies: TupN)
    (computation: FunDT)
//    (implicit tupToHlist: Generic.Aux[TupN,N]) = ???
    (implicit unwrap: Comapped.Aux[LN,s: String) => s + i.toString)
  }
}

出现以下编译错误

Error:(22,25) ambiguous implicit values:
 both method hnilComapped in object Comapped of type [F[_]]=> shapeless.ops.hlist.Comapped.Aux[shapeless.HNil,F,shapeless.HNil]
 and method hlistComapped in object Comapped of type [H,T <: shapeless.HList,F[_]](implicit mt: shapeless.ops.hlist.Comapped[T,F])shapeless.ops.hlist.Comapped.Aux[shapeless.::[F[H],T],shapeless.::[H,mt.Out]]
 match expected type shapeless.ops.hlist.Comapped.Aux[LN,Foo.this.Node,N]
    val x = foo((ni,s: String) => s + i.toString)
                        ^
Error:(22,25) Could not find implicit value for parameter unwrap: shapeless.ops.hlist.Comapped.Aux[LN,25) not enough arguments for method foo: (implicit unwrap: shapeless.ops.hlist.Comapped.Aux[LN,implicit tupToHlist: shapeless.Generic.Aux[(Foo.this.Node[Int],Foo.this.Node[String]),LN])nothing.
Unspecified value parameters unwrap,tupToHlist.
    val x = foo((ni,s: String) => s + i.toString)
                        ^

解决方法

>通常情况下无关紧要.如果您查看 language spec,则不会提及依赖于参数顺序的分辨率.
>我查看了无形的源代码,我无法想出为什么会出现这种错误.
>快速搜索语言的bug回复,我发现了一个显然已经解决similar issue.但它没有说明修复是否涉及处理症状(使上下文边界不破坏编译)或原因(对隐式参数排序的限制).

因此,我认为这是一个编译器错误,它与第3点中链接的问题紧密相关.

此外,如果您能找到比我自己更严格的分析得出的第二个意见,我建议您提交错误报告:)

希望这能让你放心.干杯!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐