私は連鎖した暗黙関数のシステムに取り組んでいます。これは以下の簡単な例に似ています。テストc1.payload == c2.payload
は、 "タイプスペース"にないテストを表しています。私はwitnessEvidence
の定義のためにマクロに入ることを期待していましたが、Scalaは明示的に任意の型の暗黙的な引数を持つマクロ定義を許可していません(WeakTypeTag値のみ!)ので、これをどのように進めるかについて少し不便です。以下のコードは論理的に私が何をしたいのかを示していますが、暗黙の関数は条件付きで証拠を生成したり生成したりすることはできません(マクロ実装内にない限り)。条件付きでスカラにimplicitsを生成する
case class Capsule[T](payload: Int)
trait A
trait B
trait C
implicit val capa = Capsule[A](3)
implicit val capb = Capsule[B](3)
implicit val capc = Capsule[C](7)
case class Evidence[T1, T2](e: Int)
implicit def witnessEvidence[T1, T2](implicit c1: Capsule[T1], c2: Capsule[T2]): Evidence[T1, T2] = {
if (c1.payload == c2.payload)
Evidence[T1, T2](c1.payload)
else
// Do not produce the evidence
}
def foo[T1, T2](implicit ev: Evidence[T1, T2]) = ev.e
val f1 = foo[A, B] // this should compile
val f2 = foo[A, C] // this should fail with missing implicit!
は 'Capsule'値、特にその' payload'ですあなたはシングルトン型を使用できることを行うために、コンパイル時に知られているフィールド? –
'payload'値は、暗黙的な連鎖の副産物として生成されます(この部分は正常に動作しているようです)。したがってコンパイル時に利用可能です。しかし、情報は型の形でコード化されていません。私は、情報がHListレコードとしてエンコードされ、暗黙的な解決がその代わりに手に入る代わりの方法に取り組んでいます。 – eje