加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:36:19 所属栏目:安全 来源:网络整理
导读:给出一些方法 def f[A,B](p: A)(implicit a: X[A,B],b: Y[B]) 隐式参数列表中前缀b的顺序对类型推断是否重要? 我认为只有不同参数列表中的参数放置很重要,例如类型信息仅从左到右通过参数列表流动. 我问,因为我注意到在单隐式列表中更改隐式参数的顺序使得
给出一些方法

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点中链接的问题紧密相关.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读