【发布时间】:2015-04-12 16:05:23
【问题描述】:
鉴于以下
case class A(value:Int)
case class B(value:String)
val h:Option[A] :: A :: Option[B] :: Option[A] :: HNil = Some(A(1)) :: A(2) :: Some(B("two")) :: (None:Option[B]) :: HNil
我怎样才能得到以下?
A(1) :: A(2) :: B("two") :: HNil
我下面的尝试
trait a extends Poly1 {
implicit def any[T] = at[T](_ :: HNil)
}
object f extends a {
implicit def some[T] = at[Option[T]](t => if (t.isDefined) t.get :: HNil else HNil)
}
适用于地图
h map f
> A(1) :: HNil :: A(2) :: HNil :: B(two) :: HNil :: HNil :: HNil
但是对于 flatMap 失败
h flatMap f
> could not find implicit value for parameter mapper: shapeless.ops.hlist.FlatMapper[f.type,shapeless.::[Option[A],shapeless.::[A,shapeless.::[Option[B],shapeless.::[Option[B],shapeless.HNil]]]]]
【问题讨论】:
-
有点不清楚你在问什么。
f是什么?flatMap的参数是什么样的?同样,正如定义的h将被静态类型化为具有Some[A]等元素,这几乎没有用处。