簡體   English   中英

在Scala TypeClass中找不到隱式參數

[英]Could not Find Implicit parameter in scala typeclass

我正在嘗試基於要加載的類型數據創建類型類-

類型如下:

trait DataSource
case class HDFSSource(path: String) extends DataSource
case class HiveTableSource(db: String, tbl: String) extends DataSource

這是特質

trait Loader[A, B, C] {
  //Any Spark loader requires
  // A -> Input Type
  // B -> Output Type
  // C -> some type of implicit context provided by the compiler from the sourounding environemnt..
  def load(input: A)(implicit context: C): B

這是實現:

object Loader {
  implicit object HiveLoader extends Loader[HiveTableSource, DataFrame, HiveContext] {
    def load(source: HiveTableSource)(implicit hc: HiveContext): DataFrame = {
      val db = source.db
      val tbl = source.tbl
      val df =  hc.sql(s"select * from $db.$tbl")
      df
    }
  }
  def loadDataSource[A: Loader, B, C](d: A) = implicitly[Loader[A,B,C]].load(d)

編譯器抱怨它找不到參數的隱式證據,特別是在“隱式[ABC]”中:

目標是擁有一個對每個類型具有不同行為的類型類,並且還使用不同的上下文(由環境隱式提供)

def loadDataSource[A, B, C](d: A)(implicit ldr: Loader[A,B,C], context: C): B = ldr.load(d)

我沒有嘗試自己編譯它,但是我很確定那是可行的。

loadDataSource[A: Loader, B, C](d: A)替代為loadDataSource[A, B, C](d: A)(implicit ev: Loader[A]) ,在這里不起作用,因為Loader需要3種參數。 因此,您必須顯式注釋隱式參數,而不是使用上下文綁定。

為了調用Loader的load方法,必須提供一個隱式C。 這就是為什么我添加了附加context: C隱式參數的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM