如何匹配无形状多边形中的Scala对象类型(如None或Nil)?
说你有这个名单如何匹配无形状多边形中的Scala对象类型(如None或Nil)?,scala,shapeless,Scala,Shapeless,说你有这个名单 val l = Some(1) :: Nil :: HNil 您希望创建一个无形状的多边形函数,该函数将与Nil上的一个隐式函数匹配,但在Some上与另一个隐式函数匹配。天真地说,我们可能认为这是可行的: object matcher extends Poly1 { implicit def caseNil = at[Nil.type](x => 0) implicit def caseSome[T] = at[Some[T]](x => 1) } 然而,
val l = Some(1) :: Nil :: HNil
您希望创建一个无形状的多边形函数,该函数将与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
。匹配一个通用的列表[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
你的代码对我来说似乎很有用,你能给我举个例子说明“这个失败得多么惊人”吗?嗯,这是出乎意料的。事实证明,我实际上是想找出元组中的匹配方式。我最终需要的是一个类型别名。