定义第三方类型类的实例,未找到隐式但显式工作正常

迪伦

我正在使用Slick 的GetResult类型类,并希望使用 Shapeless 来派生GetResult[Option[(A, B, C...)]]

我想要的是:

给定一个隐式GetResult[Option[A]], GetResult[Option[B]], ...
隐式生成一个GetResult[Option[(A, B, ...)]]

我试过的

trait CanGetOption[T] {
    def getOption: GetResult[Option[T]]
}
object CanGetOption {
    // convenience implicit resolver
    def apply[T](implicit canGetOption: CanGetOption[T]): CanGetOption[T] = canGetOption

    // base case: HNil
    implicit val getHNilOption: CanGetOption[HNil] = from(GetResult { _ => Some(HNil) })

    // recursion case: H :: Tail
    implicit def getHConsOption[H, Tail <: HList](
        implicit getHeadOption: GetResult[Option[H]], 
        canGetTailOption: CanGetOption[Tail]
    ): CanGetOption[H :: Tail] = from(GetResult[Option[H :: Tail]] { r =>
        val headOpt = getHeadOption(r)
        val tailOpt = canGetTailOption.getOption(r)
        for(head <- headOpt; tail <- tailOpt) yield head :: tail
    })

    // generic case: A, given a A <-> Repr conversion
    // I also tried moving this into a "LowPriorityImplicits" thing, just in case
    implicit def getGenericOption[A, Repr <: HList](
        implicit gen: Generic.Aux[A, Repr], 
        getReprOpt: CanGetOption[Repr]
    ): CanGetOption[A] = from(GetResult { r =>
        val reprOpt = getReprOpt.getOption(r)
        reprOpt.map(gen.from)
    })
}

implicit def resolveOptionGetter[T: CanGetOption]: GetResult[Option[T]] = 
    CanGetOption[T].getOption

问题:

当我导入上述内容时,resolveOptionGetter在搜索隐式时似乎没有考虑:

scala> implicitly[GetResult[Option[(Int, Int)]]]
<console>:19: error: could not find implicit value for parameter e: scala.slick.jdbc.GetResult[Option[(Int, Int)]]
       implicitly[GetResult[Option[(Int, Int)]]]
             ^

scala> resolveOptionGetter[(Int, Int)]
res1: scala.slick.jdbc.GetResult[Option[(Int, Int)]] = <function1>

为什么编译器resolveOptionGetter在隐式搜索中找不到我能做些什么来帮助它?

米特罗·米廷

问题是它slick.jdbc.GetResult是协变的。如果它是不变的,类型将被正确推断并且隐式将被解析。

解决方法是slick.jdbc.GetResult使用自定义不变类型别名隐藏协变GetResult删除导入slick.jdbc.GetResult并写入源文件

type GetResult[T] = slick.jdbc.GetResult[T]

object GetResult {
  def apply[T](implicit f: PositionedResult => T): GetResult[T] = slick.jdbc.GetResult.apply
}

现在implicitly[GetResult[Option[(Int, Int)]]]编译。在 Scala 2.12.7 + Shapeless 2.3.3 + Slick 3.2.3 中测试。

方差经常给隐式解析带来麻烦:

https://github.com/scala/bug/issues/10099

https://github.com/locationtech/geotrellis/issues/1292

具有协方差的隐式分辨率

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

第三方类别的类型定义

来自分类Dev

第三方类别的类型定义

来自分类Dev

遮蔽第三方类

来自分类Dev

未加载第三方框架库:“未找到图片”

来自分类Dev

Typescript 第三方定义文件 - 类缺少方法定义 - 如何扩展定义?

来自分类Dev

在Spring Boot嵌入式容器中部署第三方战争

来自分类Dev

如何使用意式浓缩咖啡测试第三方应用程序

来自分类Dev

计算类的实例-使用Firebug将jQuery注入第三方网站吗?

来自分类Dev

Roslyn:获取在第三方库中定义的类型的符号

来自分类Dev

在第三方类上实现自定义哈希码

来自分类Dev

从第三方定义的类继承时的shared_from_this

来自分类Dev

Scala:如何使用自定义属性扩展第三方类

来自分类Dev

第三方android权限如何工作?

来自分类Dev

期望第三方库功能提供“类型”

来自分类Dev

Ignite节点中来自第三方代码的Log4j:未找到配置文件

来自分类Dev

CodeIgniter第三方类未加载

来自分类Dev

复杂的第三方对象/类的深层复制

来自分类Dev

防止使用第三方基类

来自分类Dev

声明第三方库的定义属性

来自分类Dev

未找到显式活动类

来自分类Dev

Nginx第三方模块subs_filter已安装,但无法正常工作,返回未知指令

来自分类Dev

Bootstrap 3网格系统在第三方样式div(Kendo)中无法正常工作

来自分类Dev

无法使用第三方提供的类通过嵌套类型访问外部类型XXX的非静态成员

来自分类Dev

通过第三方应用程序在iOS中的Instagram自动发布或一键式共享

来自分类Dev

Singleton与第三方库

来自分类Dev

付款-IAP或第三方

来自分类Dev

停止第三方功能

来自分类Dev

使用第三方控件

来自分类Dev

第三方服务整合

Related 相关文章

热门标签

归档