给出一些方法
def f[A,B](p: A)(implicit a: X[A,B],b: Y[B])
隐式参数列表中前缀b的顺序对类型推断是否重要?
我认为只有不同参数列表中的参数放置很重要,例如类型信息仅从左到右通过参数列表流动.
我问,因为我注意到在单隐式列表中更改隐式参数的顺序使得我的程序编译.
真实的例子
以下代码使用:
>无形2.1.0
> Scala 2.11.5
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) ^