如何在隐式搜索过程中自动去除Scala特征?

如何在隐式搜索过程中自动去除Scala特征?,scala,type-inference,implicit,Scala,Type Inference,Implicit,我正在使用类型类,并且在自动派生类型时遇到问题,这些类型未经延迟地扩展了额外的(标记/指示器)特征。这很难解释,但这个最小的例子应该清楚地说明我的意思: //我们正在处理的基本类型 特色食品{} //标记性状-与食物的可食性无关 性状{} //我们要派生的指示符类型类 trait IsHarmfulToEat[F如果您使IsHarmfulToEat逆变,则编译以下代码 trait Food trait Plentiful trait IsHarmfulToEat[-F <:

我正在使用类型类,并且在自动派生类型时遇到问题,这些类型未经延迟地扩展了额外的(标记/指示器)特征。这很难解释,但这个最小的例子应该清楚地说明我的意思:

//我们正在处理的基本类型
特色食品{}
//标记性状-与食物的可食性无关
性状{}
//我们要派生的指示符类型类

trait IsHarmfulToEat[F如果您使
IsHarmfulToEat
逆变,则编译以下代码

  trait Food

  trait Plentiful

  trait IsHarmfulToEat[-F <: Food]

  object IsHarmfulToEat {
    implicit def ignoreSupply[F <: Food]
    (implicit isHarmful: IsHarmfulToEat[F]
    ): IsHarmfulToEat[F with Plentiful] =
      new IsHarmfulToEat[F with Plentiful]{}
  }

  case class Cake() extends Food {}

  object Cake {
    implicit val isBad: IsHarmfulToEat[Cake] = new IsHarmfulToEat[Cake] {}
  }

  object FoodTest extends App {
    val ignoreSupplyDoesWork: IsHarmfulToEat[Cake with Plentiful] =
      IsHarmfulToEat.ignoreSupply[Cake]

    val badCake = implicitly[IsHarmfulToEat[Cake]]
    val manyBadCakes = implicitly[IsHarmfulToEat[Cake with Plentiful]]
  }
特色食品
性状丰富

手足痛[-F谢谢。你能解释一下为什么这个修正有效吗?因为即使它使这个简化的示例得以编译,我正在研究的真正问题仍然无法解决。实际上,我不能将其表述为一个算法,我只知道删除/恢复协方差/反方差有时可以改进隐式的解析。请参阅和链接。
  trait Food

  trait Plentiful

  trait IsHarmfulToEat[-F <: Food]

  object IsHarmfulToEat {
    implicit def ignoreSupply[F <: Food]
    (implicit isHarmful: IsHarmfulToEat[F]
    ): IsHarmfulToEat[F with Plentiful] =
      new IsHarmfulToEat[F with Plentiful]{}
  }

  case class Cake() extends Food {}

  object Cake {
    implicit val isBad: IsHarmfulToEat[Cake] = new IsHarmfulToEat[Cake] {}
  }

  object FoodTest extends App {
    val ignoreSupplyDoesWork: IsHarmfulToEat[Cake with Plentiful] =
      IsHarmfulToEat.ignoreSupply[Cake]

    val badCake = implicitly[IsHarmfulToEat[Cake]]
    val manyBadCakes = implicitly[IsHarmfulToEat[Cake with Plentiful]]
  }