用斯卡拉猫将嵌套的Ior拼合在一起

时间:2019-02-18 16:22:16

标签: scala functional-programming scala-cats

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

docker network ls

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

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)]] flatten(我想将所有剩余的Ior累积到顶级Ior中)。如何做到这一点?

1 个答案:

答案 0 :(得分:4)

您可以在代码中将???中的result = ???替换为analyzed.flatten,而{{1 }},并且当左侧为半群(如此处所示)时,flatten有一个FlatMap实例。

通过替换以下两行,您可以做得更好:

Ior

具有以下内容:

FlatMap

…由于您每次在左侧使用analyzed = fileIor.bimap(identity, analyzeTranslationFiles) result = analyzed.flatten result = fileIor.flatMap(analyzeTranslationFiles) 时都可以使用bimap替换它,并且每次使用identity时都可以替换它然后map,您可以将两者都替换为map