假设我要使用三个 DSL:
sealed trait Test1Op[A]
sealed trait Test2Op[A]
sealed trait Test3Op[A]
object Test1Op {
case class Test1() extends Test1Op[String]
}
object Test2Op {
case class Test2() extends Test2Op[String]
}
object Test3Op {
case class Test3() extends Test3Op[String]
}
最终组成是:
type Api[A] = Coproduct[Test1Op, Coproduct[Test2Op, Test3Op, ?], A]
要使用它,我需要适当的Inject
实例(我相信我应该能够隐含地获得它,因为它只有两个 DSL 和一个副产品):
implicit val inj1: Inject[Test1Op, Api] = implicitly
implicit val inj2: Inject[Test2Op, Api] = implicitly
implicit val inj3: Inject[Test3Op, Api] = implicitly
这编译得很好。但是在运行时它们都是null
.
// 编辑:
上面的问题似乎将这些 val 标记为implicit
(这会导致递归解析)。删除implicit
后似乎显示正确的错误,即:
错误:(28, 36) 不明确的隐式值:类型 => scala.collection.generic.CanBuildFrom[String,Char,String] 的对象 Predef 中的值 StringCanBuildFrom 和类型 [A]=> 的对象 Predef 中的方法 $conforms :<[A,A] 匹配预期类型 T def inj1: Inject[Test1Op, Api] = 隐式
和
错误:(28, 36) 找不到参数 e 的隐式值:T def inj1: Inject[Test1Op, Api] = 隐式
和
错误:(28, 36) 类型不匹配;找到:所需单位:cats.free.Inject[com.example.Test1Op,com.example.Hello.Api] def inj1: Inject[Test1Op, Api] = 隐式