如何用Shapeless编写递归多态函数

时间:2014-01-22 00:13:41

标签: scala shapeless

我可以编写一个简单的递归多态函数:

object simpleRec extends Poly1 {
  implicit def caseInt = at[Int](identity)
  implicit def caseList[A, B](implicit ev: simpleRec.Case.Aux[A, B]) =
    at[List[A]](_.headOption.map(simpleRec))
}

这似乎很大程度上符合我的要求;但是,我似乎得到了一个荒谬的结果类型:

scala> simpleRec(List.empty[List[Int]])
res3: Option[B] = None

scala> simpleRec(List(List(1)))
res4: Option[B] = Some(Some(1))

我如何才能让这个价值为Option[Option[Int]]而不是Option[B]?我希望我在这里犯了一些愚蠢的错误,但无法弄清楚它是什么。

1 个答案:

答案 0 :(得分:2)

这可能是一个错误,以下代码按预期工作:

object simpleRec extends Poly1 {
  implicit def caseInt = at[Int](identity)
  implicit def caseList[A](implicit ev: simpleRec.Case[A]) =
    at[List[A]](_.headOption.map(simpleRec))
}

使用shapeless_2.11-2.0.0