【问题标题】:How to typesafe reduce a Collection of Either to only Right如何类型安全将 Either 的集合减少到仅 Right
【发布时间】:2019-03-13 11:02:36
【问题描述】:

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

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

【问题讨论】:

    标签: kotlin arrow-kt


    【解决方案1】:

    你可以像这样对集合进行映射:

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

    或者如果你想要左边:

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

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

    PS:没有愚蠢的问题:)

    更新: 可以避开nullables

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

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

    更新 2:

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

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

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

    【讨论】:

    • 只是我还是调用过滤函数 mapNotNull 不是很混乱?
    • @jk 这不是filter 函数,它是map().filterNotNull() 的缩写。类似于 flatMap()map().flatten() 的缩写(我想这很奇怪,因为名称的顺序发生了变化)
    • 非常感谢!我对此不太满意,但它可以解决问题。
    • 我的意思是我有 Option 或 Either 不介绍 null 但这迫使我这样做,至少在一个狭窄的范围内。
    • @sschrass 我添加了一个没有null的示例
    猜你喜欢
    • 2011-11-06
    • 2012-10-18
    • 2022-11-30
    • 2021-01-18
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    相关资源
    最近更新 更多