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

How to match a Scala Object type, like None or Nil, in a Shapeless Poly?

假设你有这个 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)
}

然而,这失败了,尽管我可能会尝试,但我似乎无法创建一个无形的 Poly 来匹配 Scala 对象类型,例如 NilNone。匹配通用 List[T] 很容易,但是匹配 Nil 似乎是不可能的。

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

它对我来说编译得很好:

@ 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