如何在无形Poly中匹配Scala对象类型,如None或Nil?

时间:2016-07-01 04:05:27

标签: scala shapeless

假设你有这个HList

val l = Some(1) :: Nil :: HNil

并且您希望创建一个无形Poly函数,该函数将与Nil上隐含的函数匹配,但Some上隐含不同。天真地,我们可能认为这会起作用:

object matcher extends Poly1 {
  implicit def caseNil = at[Nil.type](x => 0)
  implicit def caseSome[T] = at[Some[T]](x => 1)
}

然而,这种情况非常失败并且尝试我似乎无法创建一个与Scala对象类型匹配的无形Poly,如NilNone。匹配通用List[T]很容易,但匹配Nil似乎不可能。

是否可以创建一个与Scala对象类型匹配的无形Poly个案例?如果是这样,怎么样?如果没有,为什么不呢?

1 个答案:

答案 0 :(得分:1)

它编译对我很好:

@ object matcher extends Poly1 {
    implicit def caseNil = at[Nil.type](x => 0)
    implicit def caseSome[T] = at[Some[T]](x => 1)
  }
defined object matcher

@ val l = Some(1) :: Nil :: HNil
l: Some[Int] :: Nil.type :: HNil = Some(1) :: List() :: HNil

@ l.map(matcher)
res11: Int :: Int :: HNil = 1 :: 0 :: HNil