如何在隐式搜索过程中自动去除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]]
}