シングルトンの文字列を格納するタイプ依存のCfタイプがあります。
<前>ウィズウィズ一部のHListタイプの列のみを格納する別のクラスDbtestを持つイメージング:
<前>ウィズウィズ次に、Cfタイプのいくつかの拡張メソッドを記述したかったのですが、制限が1つあります。拡張メソッドが呼び出されるインスタンスのタイプは、DbtestインスタンスのHListに提示する必要があります。
<前>ウィズウィズCfおよびDbtestインスタンスのインスタンスを作成します。
<前>ウィズウィズこれをコンパイルしてほしいのは、
trait Cf {
type Name <: String with Singleton
def value: Name
}
object Cf {
type Aux[A <: String with Singleton] = Cf { type Name = A }
def apply(name: String): Aux[name.type] = {
val w = name.witness
new Cf {
override type Name = w.T
override def value: Name = w.value
}
}
}
HListで指定された:
そして、これはコンパイルしないので、
class Dbtest[T <: HList](val columns: T)
HListには表示されません。
主な問題は-暗黙のセレクタータイプを正しく指定できないため、私の
object Ops {
implicit class CfOps[C, N <: String with Singleton, T <: HList](ecf: C)
(
implicit
db: Dbtest[T]
, ev: C =:= Cf.Aux[N]
, selector: Selector[T, C]
) {
private val cf = selector(db.columns)
def simplePrint(): Unit = println(cf.value)
}
}
メソッドはコンパイラーからは見えません。
セレクタータイプを正しく指定する方法はありますか?
object Test extends App {
val c = Cf("c")
val b = Cf("b")
val g = Cf("g")
implicit val db = new Dbtest(c :: b :: HNil)
...
- 解決した方法 # 1
N
を推測する方法はありませんCfOps(ecf)
で 特定のecf: C
、そうN
いくつかの抽象的なタイプであり、暗黙の証拠はありませんC =:= Cf.Aux[N]
。CfOps
の定義を置き換えてみてください とその後
<前>ウィズウィズimplicit class CfOps[N <: String with Singleton, T <: HList](ecf: Cf.Aux[N])( implicit db: Dbtest[T], selector: Selector[T, Cf.Aux[N]] ) { private val cf = selector(db.columns) def simplePrint(): Unit = println(cf.value) }