Shapeless:将带有一些选项的元组映射到选项
Shapeless: map a tuple with some options to options
有
(Some(1), 2, Some(3))
我希望得到
(Some(1), Some(2), Some(3))
有了 shapeless 可以这样做吗?
是的,无形可以做很多事情!
import shapeless._
import syntax.std.tuple._
trait basicOption extends Poly1 {
implicit def default[T] = at[T](t => Some(t))
}
object fullOption extends basicOption {
implicit def caseSome[T] = at[Some[T]](s => s)
implicit def caseNone = at[None.type](s => s)
}
println((Some(1),2,Some(3)).map(fullOption)) // (Some(1),Some(2),Some(3))
println((Some(1),2,None).map(fullOption)) // (Some(1), Some(2), None)
有关更多示例,您可以查看他们的 github repo
这适用于 Shapeless 2.0 及更高版本,如果您使用的是旧版本,您仍然可以这样做,但不是直接在元组上调用 map
,而是必须通过 HList
。
是的,
scala> import shapeless._, syntax.std.tuple._
import shapeless._
import syntax.std.tuple._
scala> :paste
// Entering paste mode (ctrl-D to finish)
object opt extends opt0 {
implicit def optId[T <: Option[_]] = at[T](identity)
}
trait opt0 extends Poly1 {
implicit def default[T] = at[T](Option(_))
}
// Exiting paste mode, now interpreting.
defined object opt
defined trait opt0
scala> (Some(1), 2, Some(3)) map opt
res0: (Some[Int], Option[Int], Some[Int]) = (Some(1),Some(2),Some(3))
您会注意到第一个和最后一个位置的 Some[Int]
已被保留,而提升的中间元素被键入为 Option[Int]
。我假设你的实际意图是这样的,
scala> (Option(1), 2, Option(3)) map opt
res1: (Option[Int], Option[Int], Option[Int]) = (Some(1),Some(2),Some(3))
有
(Some(1), 2, Some(3))
我希望得到
(Some(1), Some(2), Some(3))
有了 shapeless 可以这样做吗?
是的,无形可以做很多事情!
import shapeless._
import syntax.std.tuple._
trait basicOption extends Poly1 {
implicit def default[T] = at[T](t => Some(t))
}
object fullOption extends basicOption {
implicit def caseSome[T] = at[Some[T]](s => s)
implicit def caseNone = at[None.type](s => s)
}
println((Some(1),2,Some(3)).map(fullOption)) // (Some(1),Some(2),Some(3))
println((Some(1),2,None).map(fullOption)) // (Some(1), Some(2), None)
有关更多示例,您可以查看他们的 github repo
这适用于 Shapeless 2.0 及更高版本,如果您使用的是旧版本,您仍然可以这样做,但不是直接在元组上调用 map
,而是必须通过 HList
。
是的,
scala> import shapeless._, syntax.std.tuple._
import shapeless._
import syntax.std.tuple._
scala> :paste
// Entering paste mode (ctrl-D to finish)
object opt extends opt0 {
implicit def optId[T <: Option[_]] = at[T](identity)
}
trait opt0 extends Poly1 {
implicit def default[T] = at[T](Option(_))
}
// Exiting paste mode, now interpreting.
defined object opt
defined trait opt0
scala> (Some(1), 2, Some(3)) map opt
res0: (Some[Int], Option[Int], Some[Int]) = (Some(1),Some(2),Some(3))
您会注意到第一个和最后一个位置的 Some[Int]
已被保留,而提升的中间元素被键入为 Option[Int]
。我假设你的实际意图是这样的,
scala> (Option(1), 2, Option(3)) map opt
res1: (Option[Int], Option[Int], Option[Int]) = (Some(1),Some(2),Some(3))