我已经遇到过几次我有减速器/结合fn的情况,如下所示:
def combiner(a: String, b: String): Either[String, String] = {
(a + b).asRight[String]
}
Run Code Online (Sandbox Code Playgroud)
它是一个虚拟实现,但是fn可能失败,因此它返回一个。然后,我有了一个要通过reduce / fold传递的值的列表。我能想到的最好的方法(假设List的类型是一个monoid)是这样的:
def combine(items: Vector[String]) = {
items.foldLeft(Monoid[String].empty.asRight[String]) { case (acc, value) =>
acc.flatMap( accStr => combiner(accStr, value))
}
}
Run Code Online (Sandbox Code Playgroud)
它有点笨拙,并且作为一种相当通用的模式,我怀疑有更好的方法来使用猫。