如何类型安全地将 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()
是可选的,因为 mapNotNull
是 Iterable
上的扩展函数,并且始终 returns List
PS:没有愚蠢的问题:)
更新:
可以避免 nullables
:
val successes = originalSet
.map { it.toOption() }
.filter { it is Some }
.toSet()
我们可能会添加 Iterable<Option<A>>.filterSome
和 Iterable<Either<A, B>.mapAsOptions
函数。
更新二:
最后一个例子returns一个Set<Option<Success>>
。如果您想在不使用 null
的情况下打开结果,那么您可以尝试的一件事是折叠 Set
:
val successes = originalSet
.fold(emptySet<Success>()) { acc, item ->
item.fold({ acc }, { acc + it })
}
最后一个选项(无意的双关语)不需要使用 Option
。
也许是个愚蠢的问题,但我就是不明白。
我有一个 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()
是可选的,因为 mapNotNull
是 Iterable
上的扩展函数,并且始终 returns List
PS:没有愚蠢的问题:)
更新:
可以避免 nullables
:
val successes = originalSet
.map { it.toOption() }
.filter { it is Some }
.toSet()
我们可能会添加 Iterable<Option<A>>.filterSome
和 Iterable<Either<A, B>.mapAsOptions
函数。
更新二:
最后一个例子returns一个Set<Option<Success>>
。如果您想在不使用 null
的情况下打开结果,那么您可以尝试的一件事是折叠 Set
:
val successes = originalSet
.fold(emptySet<Success>()) { acc, item ->
item.fold({ acc }, { acc + it })
}
最后一个选项(无意的双关语)不需要使用 Option
。