gpt4 book ai didi

scala - 将 Scala Iterable[T] 转换为 Option[Iterable[S]],如果所有 T 都是 S 的实例,则填充?

转载 作者:行者123 更新时间:2023-12-02 02:07:59 25 4
gpt4 key购买 nike

我有一种模糊的感觉,这样的方法可能存在(可能在 Cats 中?) - 目的是转变一个 Iterable[T] (Set [T] 是我真正感兴趣的)到 Option[Iterable[S]] - 结果是:

  • Some[Iterable[S]] :如果 Iterable[T] 中的所有条目都是 S< 的实例
  • None :如果 Iterable[T] 中的任何条目不是 S
  • 的实例

我知道 Cats 中已经有一种类似的方法,由 Alternative 授予。 - 它是单独的:

import cats.implicits._
import alleycats.std.set._

val stringsAndInts: Set[Either[String, Int]] = Set(Right(6),Left("Foo"))
val (strings: Set[String], ints: Set[Int]) = stringsAndInts.separate

...这对于 Set[Either[A,B] 效果很好 - 但对于这个问题,我只对任何旧的 Set[T] 感兴趣.

收集怎么样?

此代码使用Scala标准库方法collect将编译 - 但请注意,它始终会生成 Set[S] - 即使某些 setOfT 不是 S 的实例:

val setOfT: Set[T] = ???
val setOfS: Set[S] = setOfT.collect {case s: S => s}

最佳答案

考虑无形类型安全类型转换

import shapeless._
import syntax.typeable._

val xs: Set[Any] = Set("picard", "worf")

xs.cast[Set[Int]]
// res1: Option[Set[Int]] = None

xs.cast[Set[String]]
// res2: Option[Set[String]] = Some(value = Set("picard", "worf"))

如果您希望具有与 collect 类似的功能,并且类路径上已经有猫,那么这里是一行代码

import alleycats.std.set._
animals.map(implicitly[ClassTag[Dog]].unapply).sequence

Option[Set[Dog]]的类型。

关于scala - 将 Scala Iterable[T] 转换为 Option[Iterable[S]],如果所有 T 都是 S 的实例,则填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68134401/

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