gpt4 book ai didi

scala - 带有选项的无形状平面图 HList 产生 HList

转载 作者:行者123 更新时间:2023-12-01 05:05:11 27 4
gpt4 key购买 nike

鉴于以下

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)
}

适用于 map
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]]]]]

最佳答案

很可能你唯一能做的就是为 Some 定义单独的案例。和 None :

trait a extends Poly1 {
implicit def default[T] = at[T](_ :: HNil)
}
object f extends a {
implicit def caseSome[T] = at[Some[T]](_.get :: HNil)
implicit def caseNone = at[None.type](_ => HNil)
}

这也意味着您不能使用通用 Option类型中的s,编译时必须知道每个元素是否为 SomeNone :
scala> (Some(A(1)) :: A(2) :: Some(B("two")) :: None :: HNil) flatMap f
res1: shapeless.::[A,shapeless.::[A,shapeless.::[B,shapeless.HNil]]] = A(1) :: A(2) :: B(two) :: HNil

这种区别定义了结果表达式的类型: Some(1) :: HNil flatMap f将有类型 ::[Int, HNil] ,但是 None :: HNil flatMap f将只有类型 HNil .

这种类型信息在编译时无法从简单的 Option 中找出来s:应该 (x: Option[T]) :: HNil flatMap f有型 ::[T, HNil]HNil ?我们不知道直到我们实际运行程序并查看 x 的值是多少。是。

我不确定是否有一些聪明的方法可以做到这一点并获得不透明的 HList ,但此时您将放弃关于每个元素和列表长度的确切类型信息,也可以将其转换为正常的 List (如果您知道最终结果的确切类型,也许以后可以使用来自 shapeless 的 cast)

关于scala - 带有选项的无形状平面图 HList 产生 HList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29566279/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com