用scala-cats展平嵌套的Ior's

问题描述 投票:2回答:1

使用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's到顶级Ior)。怎么能实现这一目标?

scala functional-programming scala-cats
1个回答
4
投票

你可以在代码中用???替换result = ???中的analyzed.flatten并且它将完美地工作,这要归功于flatten提供的FlatMap语法方法以及当左侧是半群时IorFlatMap实例的事实(因为它在这里) )。

你可以通过替换这两行来做得更好一点:

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

具有以下内容:

result = fileIor.flatMap(analyzeTranslationFiles)

...因为任何时候你在bimap左侧使用identity,你可以用map替换它,任何时候你使用map然后flatten,你可以用flatMap替换它们。

© www.soinside.com 2019 - 2024. All rights reserved.