我正在尝试使用Cats数据类型Ior来累积错误和使用服务的成功(可能会返回错误)。
def find(key: String): F[Ior[NonEmptyList[Error], A]] = {
(for {
b <- service.findByKey(key)
} yield b.rightIor[NonEmptyList[Error]])
.recover {
case e: Error => Ior.leftNel(AnotherError)
}
}
def findMultiple(keys: List[String]): F[Ior[NonEmptyList[Error], List[A]]] = {
keys map find reduce (_ |+| _)
}
我的困惑在于如何合并错误/成功。我正在尝试使用Semigroup组合(中缀语法)进行组合,但没有成功。有一个更好的方法吗?任何帮助都会很棒。
对于此特定示例,它实际上取决于F是什么。您可能需要为您的方法提供隐式输入。它以最丑陋的形式出现,如下所示:
def findMultiple[F[_], A](keys: List[String])(implicit SF:Semigroup[F[Ior[NonEmptyList[Error],A]]]): F[Ior[NonEmptyList[Error], A]] = ???