1

假设我要使用三个 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] = 隐式

4

1 回答 1

1

像往常一样,在提出问题后几分钟就找到了解决方案:

  1. 删除implicit(见问题编辑)
  2. Api[A]类型:

    type PartialApi[A] = Coproduct[Test2Op, Test3Op, A]
    type Api[A] = Coproduct[Test1Op, PartialApi, A]
    
  3. 从工作中获利Inject
于 2016-10-27T14:08:05.863 回答