【问题标题】:Flatten nested Ior's with scala-cats用 scala-cats 展平嵌套的 Ior's
【发布时间】:2019-02-18 16:22:15
【问题描述】:

使用 scala-cat 的 Ior 数据类型我遇到了以下问题:

import cats._
import cats.data._
import cats.implicits._

type Locale = String
type FailureMessage = String
type Failures = NonEmptyList[FailureMessage]

private def listTranslationFiles(): IO[FailureMessage Either Array[File]] = ???

private def analyzeTranslationFiles(fs: Array[File]): Failures Ior Seq[(Locale, File)] = ???

private def readTranslations(): IO[Failures Ior Seq[(Locale, File)]] = for {
    files <- listTranslationFiles()
    fileIor = if(files.isLeft) (NonEmptyList(files.left.get, Nil): Failures).leftIor
              else files.right.get.rightIor
    // fileIor: Ior[Failures, Array[File]]
    analyzed = fileIor.bimap(identity, analyzeTranslationFiles)
    // analyzed: Ior[Failures, Ior[Failures, Seq[(Locale, File)]]]
    result = ??? //  how do I 'flatten' analyzed here?
} yield result

在我的最后一步中,我需要转换这种类型:

Ior[Failures, Ior[Failures, Seq[(Locale, File)]]]

进入:

Ior[Failures, Seq[(Locale, File)]]

通过某种方式flattening Ior(我想将所有剩余的Ior 累积到顶层Ior 中)。如何做到这一点?

【问题讨论】:

    标签: scala functional-programming scala-cats


    【解决方案1】:

    由于FlatMap 提供的flatten 语法方法以及Ior 具有FlatMap 左侧是半群时的实例(就像这里一样)。

    您可以通过替换这两行来做得更好:

    analyzed = fileIor.bimap(identity, analyzeTranslationFiles)
    result = analyzed.flatten
    

    以下内容:

    result = fileIor.flatMap(analyzeTranslationFiles)
    

    ...因为任何时候你使用bimap 和左侧的identity,你可以用map 替换它,任何时候你使用map 然后flatten,你可以将两者都替换为flatMap

    【讨论】:

    • 由于某种原因,IntelliJ 告诉我 flattenIor 上不存在(据我所知,我得到了所有隐式导入)。不过,您的第二种方法效果很好。非常感谢!
    • 我不想告诉你这个,但在某些时候你将不得不在 IntelliJ 和惯用的 Cats 使用代码之间做出选择。 :)
    • 是的,我已经注意到,随着我对猫的深入了解,IntelliJ 让我越来越失望。每个新类型类的性能和代码完成都变得越来越差。 :)
    猜你喜欢
    • 2014-05-28
    • 2015-04-18
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2018-08-13
    相关资源
    最近更新 更多