假设你有这个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
,如Nil
或None
。匹配通用List[T]
很容易,但匹配Nil
似乎不可能。
是否可以创建一个与Scala对象类型匹配的无形Poly
个案例?如果是这样,怎么样?如果没有,为什么不呢?
答案 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