gpt4 book ai didi

scala - Scala 中隐式参数的顺序重要吗?

转载 作者:行者123 更新时间:2023-12-03 03:32:26 26 4
gpt4 key购买 nike

给出一些方法

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

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

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

我问这个问题是因为我注意到更改单隐式列表中隐式参数的顺序可以使我的程序编译。

真实示例

使用以下代码:

  • 无形2.1.0
  • 斯卡拉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, Node, 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, 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, Node, 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)
}
}

出现以下编译错误

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],F,shapeless.::[H,mt.Out]]
match expected type shapeless.ops.hlist.Comapped.Aux[LN,Foo.this.Node,N]
val x = foo((ni,ns))((i: Int, s: String) => s + i.toString)
^
Error:(22, 25) could not find implicit value for parameter unwrap: shapeless.ops.hlist.Comapped.Aux[LN,Foo.this.Node,N]
val x = foo((ni,ns))((i: Int, s: String) => s + i.toString)
^
Error:(22, 25) not enough arguments for method foo: (implicit unwrap: shapeless.ops.hlist.Comapped.Aux[LN,Foo.this.Node,N], implicit tupToHlist: shapeless.Generic.Aux[(Foo.this.Node[Int], Foo.this.Node[String]),LN])Nothing.
Unspecified value parameters unwrap, tupToHlist.
val x = foo((ni,ns))((i: Int, s: String) => s + i.toString)
^

最佳答案

  1. 通常情况下这应该不重要。如果你看language spec它没有提到分辨率取决于参数顺序。

  2. 我查看了 shapeless 的源代码,但我无法找出出现此错误的任何原因。

  3. 通过该语言的 bug 存储库进行快速搜索,我发现了 similar issue这显然已经解决了。但它没有说明修复是否涉及治疗症状(使上下文边界不破坏编译)或原因(对隐式参数排序的限制)。

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

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

希望这能让您放心。干杯!

关于scala - Scala 中隐式参数的顺序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29140150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com