2015-11-20 31 views
0

這是Diverging implicit expansion for type class的延續。我想出了另一個版本,但仍然沒有編譯,但現在是另一個原因,因此是一個不同的問題。這是我做的:未找到類型類的隱式方法

我基本上增加了一個新的類型類NestedParser的情況下,其中一些案例類由其他案例類組成。

trait Parser[A] { 
    def apply(s: String): Option[A] 
} 
trait NestedParser[A] { 
    def apply(s: String): Option[A] 
} 

object Parser { 
    def apply[A](s: String)(implicit parser: Parser[A]): Option[A] = parser(s) 
} 
object NestedParser { 
    def apply[A](s: String)(implicit parser: NestedParser[A]): Option[A] = parser(s) 
} 

我已經改變了先前的隱函數返回NestedParser避免發散隱含擴展。否則,它像以前一樣:

implicit def nestedCaseClassParser[A, B, C] 
    (
    implicit pb: Parser[B], 
    pc: Parser[C], 
    gen: Generic.Aux[A, B :: C :: HNil] 
): NestedParser[A] = new NestedParser[A] { 
    override def apply(s: String): Option[A] = { 
     val tmp = s.span(_ != '|') match { 
     case (h, t) => 
      for { 
      a <- pb(h) 
      b <- pc(t.substring(1)) 
      } yield a :: b :: HNil 
     } 
     tmp.map(gen.from) 
    } 
    } 

案例類和以前一樣:

case class Person(name: String, age: Int) 
case class Family(husband: Person, wife: Person) 

現在,當我嘗試分析Family,我得到以下編譯錯誤:

scala> NestedParser[Family]("") 
<console>:32: error: could not find implicit value for parameter parser: NestedParser[Family] 
     NestedParser[Family]("") 

但是,這對我沒有意義。上面的函數明確提供了NestedParser的隱式實例。爲什麼它不能滿足編譯器?

回答

0

那麼,據我所見,你沒有提供nestedCaseClassParser要求的任何隱含的Parser實例。

+0

由於這是另一個問題的延續,我還沒有發佈完整的代碼。實際上,代碼摘自以下博客文章:https://meta.plasm.us/posts/2015/11/08/type-classes-and-generic-derivation/。我只添加了'NestedParser'特徵和伴隨對象以及'隱式的def nestedCaseClassParser [A,B,C]' – Haspemulator