用 scala-cats 压平嵌套的 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
ing Ior
(我想将所有剩余的 Ior
累积到顶级 Ior
中)。如何实现?
您可以直接将 result = ???
中的 ???
替换为代码中的 analyzed.flatten
并且它会完美地工作,这要归功于 flatten
提供的语法方法 FlatMap
以及 Ior
在左侧是半群时有一个 FlatMap
实例的事实(就像这里一样)。
你可以通过替换这两行来做得更好:
analyzed = fileIor.bimap(identity, analyzeTranslationFiles)
result = analyzed.flatten
具有以下内容:
result = fileIor.flatMap(analyzeTranslationFiles)
…因为任何时候你在左侧使用 bimap
和 identity
,你可以用 map
替换它,并且任何时候你使用 [=21] =] 然后 flatten
,你可以用 flatMap
.
替换两者
使用 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
ing Ior
(我想将所有剩余的 Ior
累积到顶级 Ior
中)。如何实现?
您可以直接将 result = ???
中的 ???
替换为代码中的 analyzed.flatten
并且它会完美地工作,这要归功于 flatten
提供的语法方法 FlatMap
以及 Ior
在左侧是半群时有一个 FlatMap
实例的事实(就像这里一样)。
你可以通过替换这两行来做得更好:
analyzed = fileIor.bimap(identity, analyzeTranslationFiles)
result = analyzed.flatten
具有以下内容:
result = fileIor.flatMap(analyzeTranslationFiles)
…因为任何时候你在左侧使用 bimap
和 identity
,你可以用 map
替换它,并且任何时候你使用 [=21] =] 然后 flatten
,你可以用 flatMap
.