如何在无形多边形中匹配 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 对象类型,例如 Nil
或 None
。匹配通用 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
假设你有这个 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 对象类型,例如 Nil
或 None
。匹配通用 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