Scala doobie select的类型参数化

Scala doobie select的类型参数化,scala,doobie,Scala,Doobie,我试图创建一个方法,该方法将接受一个case类并以列表[C]的形式返回元素。为了测试这些东西,我有以下几种方法 object LocalRun extends App { implicit private val cs = IO.contextShift(ExecutionContexts.synchronous) private lazy val xa = Transactor.fromDriverManager[IO]( "org.h2.Driver"

我试图创建一个方法,该方法将接受一个case类并以列表[C]的形式返回元素。为了测试这些东西,我有以下几种方法

object LocalRun extends App {

  implicit private val cs = IO.contextShift(ExecutionContexts.synchronous)

  private lazy val xa = Transactor.fromDriverManager[IO](
    "org.h2.Driver",
    "jdbc:h2:./dbdir/mydb:mydb",
    "",
    "",
    Blocker
      .liftExecutionContext(ExecutionContexts.synchronous)
  )

  val stmt: String =
    "select table_name, count(1) as col_cnt from information_schema.columns where table_name = 'FUNCTION_COLUMNS'"

  private val proc: fs2.Stream[doobie.hi.ConnectionIO, (String, Int)] =
    HC.stream[(String, Int)](stmt, HPS.set(()), 512)

  proc.compile.toList
    .transact(xa).unsafeRunSync.take(5).foreach(e =>
      println(s"table name: ${e._1}, number of columns: ${e._2}")
    )

  new Directory(new File("./dbdir/mydb")).deleteRecursively()

}
输出

table name: FUNCTION_COLUMNS, number of columns: 17
我想创造一些像

def runSelect[C](stmt: String) = HC.stream[C](stmt, HPS.set(()), 512)
但编译器向我抛出以下错误:


有没有办法克服此错误并创建多态函数,该函数将接受任何带有匹配select的任意case类并返回列表?

[C:Read]
-在不了解隐式和类型类的情况下使用Doobie这样的高级库可能会很困难。如果您想以这种方式使用隐式val,隐式val ccRead:Read[cc]=Read[(String,String)]。map{case(x,y)=>cc(x,y)}然后调用runSelect[cc](stmt),这并不能完全解决我的问题o,我是这样说的:
def runSelect[C:Read](stmt:String)=HC.stream[C](stmt,HPS.set(()),512)
,这与
def runSelect[C](stmt:String)(implicit ev:Read[C])=HC stream[C](stmt,HPS.set(()),512)
-我重复一遍,这将有助于了解隐式和隐式。