Я пару раз оказывался в ситуации, когда у меня есть редуктор / комбайн fn примерно так:
def combiner(a: String, b: String): Either[String, String] = {
(a + b).asRight[String]
}
Это фиктивная реализация, но fn может потерпеть неудачу, поэтому он возвращает либо. Затем у меня есть список значений, которые я хочу пройти с помощью Reduce / Fold. Лучшее, что я могу придумать (при условии, что тип List является моноидом), это:
def combine(items: Vector[String]) = {
items.foldLeft(Monoid[String].empty.asRight[String]) { case (acc, value) =>
acc.flatMap( accStr => combiner(accStr, value))
}
}
Это немного неуклюже, и, как довольно общий шаблон, я подозреваю, что есть лучший способ сделать это, используя кошек.