1

使用したい 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] = 暗黙的に

4

1 に答える 1