說我有三個領域特定語言我想使用:免費單子 - 隱進樣嵌套使用上積貓
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
情況下(我相信我應該能夠得到暗示,因爲它只有兩個領域特定語言和一個副產品):
implicit val inj1: Inject[Test1Op, Api] = implicitly
implicit val inj2: Inject[Test2Op, Api] = implicitly
implicit val inj3: Inject[Test3Op, Api] = implicitly
這個編譯好。但是在運行時它們都是null
。
//編輯:
上述問題似乎標誌着這些瓦爾斯如implicit
(導致遞歸分辨率)。除去implicit
後它似乎顯示正確的錯誤,這是:
錯誤:(28,36)不明確的隱式的值: 在類型=> scala.collection.generic.CanBuildFrom的對象PREDEF [字符串兩者值StringCanBuildFrom,炭,字符串] 和方法$符合在種類型的目標PREDEF [A] => <:< [A,A] 匹配預期類型T DEF INJ1:注射[Test1Op,API] =隱含
和
錯誤:(28,36)找不到參數e的隱含值:T DEF INJ1:注射[Test1Op,API] =隱含
和
錯誤:(28,36)型不匹配; 發現:單位 需要:cats.free.Inject [com.example.Test1Op,com.example.Hello.Api] DEF INJ1:注射[Test1Op,API] =隱含