在使用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
中)。如何做到这一点?
答案 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
。