如何类型安全地将 Either 的集合减少为唯一的 Right

How to typesafe reduce a Collection of Either to only Right

也许是个愚蠢的问题,但我就是不明白。

我有一个 Set<Either<Failure, Success>>,想用 Arrow-kt 输出一个 Set<Success>

你可以这样映射右边的集合:

val successes = originalSet.mapNotNull { it.orNull() }.toSet()

或者如果你想要左边的:

val failures = originalSet.mapNotNull { it.swap().orNull() }.toSet()

如果您想将最后的 toSet() 保留为 Set,则最后的 toSet() 是可选的,因为 mapNotNullIterable 上的扩展函数,并且始终 returns List

PS:没有愚蠢的问题:)

更新: 可以避免 nullables:

val successes = originalSet
  .map { it.toOption() }
  .filter { it is Some }
  .toSet()

我们可能会添加 Iterable<Option<A>>.filterSomeIterable<Either<A, B>.mapAsOptions 函数。

更新二:

最后一个例子returns一个Set<Option<Success>>。如果您想在不使用 null 的情况下打开结果,那么您可以尝试的一件事是折叠 Set:

val successes = originalSet
  .fold(emptySet<Success>()) { acc, item -> 
    item.fold({ acc }, { acc + it })
  }

最后一个选项(无意的双关语)不需要使用 Option