使用したい 3 つの 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
インスタンスが必要です (2 つの DSL と 1 つの副産物だけで、暗黙のうちに取得できるはずです)。
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) あいまいな暗黙の値: タイプ [A] のオブジェクト Predef の値 StringCanBuildFrom => scala.collection.generic.CanBuildFrom[String,Char,String] とメソッド $conforms の両方 => < :<[A,A] 予想される型 T def inj1 に一致: Inject[Test1Op, Api] = 暗黙的に
と
エラー:(28, 36) パラメータ e の暗黙的な値が見つかりませんでした: T def inj1: Inject[Test1Op, Api] = 暗黙的に
と
エラー:(28, 36) タイプが一致しません。found : 必要なユニット: cats.free.Inject[com.example.Test1Op,com.example.Hello.Api] def inj1: Inject[Test1Op, Api] = 暗黙的に