使用依赖于上下文绑定的选择编写类型类

反应堆僧侣

我的初始代码:

sealed trait Adder[L <: HList, U] extends DepFn2[L, Vector[U]]

object Adder {
  def apply[L <: HList, U: Ordering](implicit adder: Adder[L, U]): Aux[L, U, adder.Out] = adder

  type Aux[L <: HList, U, Out0] = Adder[L, U] { type Out = Out0 }

  implicit def found[T <: HList, U: Ordering]: Aux[Vector[U] :: T, U, Vector[U] :: T] =
    new Adder[Vector[U] :: T, U] {
      type Out = Vector[U] :: T
      def apply(l: Vector[U] :: T, collection: Vector[U]): Out = {
        (l.head ++ collection).sorted :: l.tail
      }
    }

  implicit def notFound[H, T <: HList, U: Ordering, OutT <: HList](implicit ut: Aux[T, U, OutT]): Aux[H :: T, U, H :: OutT] =
    new Adder[H :: T, U] {
      type Out = H :: OutT
      def apply(l: H :: T, collection: Vector[U]): Out = {
        val outT = ut(l.tail, collection)
        l.head :: outT
      }
    }

  implicit def empty[U: Ordering]: Aux[HNil, U, Vector[U] :: HNil] =
    new Adder[HNil, U] {
      type Out = Vector[U] :: HNil
      def apply(l: HNil, collection: Vector[U]): Out = collection :: HNil
    }
}

我发现了一个错误,即没有上下文绑定的事物Ordering通过类型notFound而不是传递found,这在hinsight中并不令人惊讶。我试图通过添加另一个隐式来修复该错误,该隐式应在没有此隐式时触发Ordering

  implicit def foundNoOrdering[T <: HList, U]: Aux[Vector[U] :: T, U, Vector[U] :: T] =
    new Adder[Vector[U] :: T, U] {
      type Out = Vector[U] :: T
      def apply(l: Vector[U] :: T, collection: Vector[U]): Out = {
        l.head ++ collection :: l.tail
      }
    }

但是,这导致foundNoOrdering之间的含糊不清found如何根据是否存在不同的代码路径Ordering

迪迪埃·杜邦(Didier Dupont)

标准技巧是通过将隐式变量放在祖先特征中来降低优先级

object Adder extends LowPriorityAdderImplicits {
   implicit def found...
}

trait LowPriorityAdderImplicits {
  implicit def foundNoOrdering....
}  

您会在标准库中找到其中一些。LowPriorityImplicits似乎是习惯名称。

在规范中:

  • SLS§7.2隐式参数

如果有多个与隐式参数的类型匹配的合格参数,则将使用静态重载解析规则(第6.26.3节)选择一个最具体的参数。

  • SLS§6.26.3:相关位太长,无法完整引用,但是您有一些关于

如果满足以下条件之一,则从类或对象D派生类或对象C:

•C是D的子类,或者

•C是从D派生的类的伴侣对象,或者

•D是派生C的类的伴随对象。

并使其更加具体,并在解决方案中获得优先考虑。我相信那是为隐性而做的。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

多个React上下文:内部的依赖于外部的不起作用

如何处理视图依赖于 MVVM 上下文中的多个模型的情况?

如何在没有Dagger且不导致Presenter依赖于上下文的情况下在MVP中使用共享首选项?

具有上下文绑定的类型类隐式

在依赖于 URL 的上下文中创建初始状态,在 NextJS 中未定义窗口

在类型依赖的上下文中使用constexpr

如何在Scala中将依赖于路径的类型与类型类一起使用

“特殊方法的隐式使用始终依赖于特殊方法的类级绑定”

依赖于特定类类型的C ++模板方法?

使用依赖于lambda函数的类型作为返回类型

使用NInject进行上下文绑定

编写依赖于IntersectionObserver调用的测试

C ++变量在类的所有实例中使用依赖于类的类型和函数具有相同的值

使用'typename'关键字将非类型视为依赖上下文中的类型

绑定控制依赖于 bool

为同一个构造函数参数使用不同名称的2+个依赖类的Ninject上下文绑定

选择依赖于CURDATE MySQL

使用ClassTag上下文绑定的参数类型的匿名子类

在类上下文中使用“ this”类型的Typescript条件类型的问题

使用上下文注入替换非绑定类中的ScenarioContext.Current

编写具有依赖于继承成员的函数的基类的正确方法

上下文绑定到更高种类的类型?

任何带有类型上下文绑定的

具有自己上下文绑定的类

如何指定依赖于单独类型的闭包借用绑定的生存期?

如何在类型依赖于派生类的基础模板类中声明成员?

Ruby绑定上下文

使用自己的类名在推论上下文中解析类型

模板问题,静态继承。无法为成员依赖于类型的类 Sorter 完成代码