Scala:使用Try[T]作为返回类型来链接多个函数



我是Scala函数式编程的新手,正在开发一个模块,其中每个操作符(类实例/对象(都链接在一起。运算符只有一个函数,该函数返回Try[T]。我正在寻找一种更可读的方式将它们链接在一起。

trait Mapper {
def map(in: T): Try[T]
}
trait Reducer {
def reduce(in: T): Try[T]
}
trait Grouper {
def group(in: T, batchSize: int): Try[T]
}

假设我已经为这些特性创建了实现。现在在我的主要功能中,我可以做一些类似的事情

object MyApp extends App {
val mapper: Mapper = ...
val reducer: Reducer = ...
val grouper: Grouper = ...  
def run(): Try[Unit] = {
val inp: T = ...
mapper.map(inp) match {
case Success(x) => reducer.reduce(x) match {
case Success(y) => grouper.group(x) match {
case Success(z) => ..// some other function call
case Failure(e) => throw e
}
case Failure(e) => throw e
}
case Failure(e) => throw e
}
}
run()
}

有没有一种方法,我可以避免所有这些成功、失败模式的匹配,并用更好的方式来做?

简单而典型的for-comprehension就是这种情况:

def run(): Try[Unit] = {
val inp: T = ...
for {
mapResult <- mapper.map(inp)
reduceresult <- reducer.reduce(mapResult)
groupResult <- grouper.group(x)
} yield ()
}

你可以在互联网上找到很多关于这个主题的学习材料,但本质上,对于像你这样的案例,这是对flatMapmapwithFilterforeach的语法糖。

最新更新