繁体   English   中英

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

[英]Flatten nested Ior's with scala-cats

使用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)]]

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

您可以直接替换??? result = ??? analyzed.flatten在代码中,它会很好地工作,多亏了flatten所提供的语法方法FlatMap和事实IorFlatMap实例时,左侧是一个半群(因为它是在这里)。

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

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

具有以下内容:

result = fileIor.flatMap(analyzeTranslationFiles)

…由于您bimap使用左侧具有identity bimap时,都可以将其替换为map ,并且flatMap使用map然后将其flatten ,都可以将它们都替换为flatMap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM