以下是给定的内容
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]
等元素,这几乎从来没有用过。 - Travis Brown