Сгладить гнездо Иора со скалами - PullRequest
0 голосов
/ 18 февраля 2019

Работа с типом данных 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).Как этого достичь?

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете буквально просто заменить ??? в result = ??? на analyzed.flatten в своем коде, и он будет работать отлично, благодаря синтаксическому методу flatten, предоставленному FlatMap, и тому факту, что Ior имеетFlatMap экземпляр, когда левая сторона является полугруппой (как здесь).

Вы можете сделать немного лучше, заменив эти две строки:

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

наследующее:

result = fileIor.flatMap(analyzeTranslationFiles)

… поскольку каждый раз, когда вы используете bimap с identity на левой стороне, вы можете заменить его на map, и в любое время, когда вы используете mapи затем flatten, вы можете заменить оба на flatMap.

...