使用Scala和Cats(或其他专注于范畴论和/或函数式编程的库)最适合以最功能性(代数)的方式解决此问题的方法是什么?
资源
假设我们有以下方法,它们执行REST API调用以检索单个信息片段?
type FutureApiCallResult[A] = Future[Either[String, Option[A]]]
def getNameApiCall(id: Int): FutureApiCallResult[String]
def getAgeApiCall(id: Int): FutureApiCallResult[Int]
def getEmailApiCall(id: Int): FutureApiCallResult[String]
正如您所看到的,它们产生了异步结果。Either单子用于在API调用期间返回可能的错误,而Option用于在API未找到资源时返回None(此情况不是错误,而是可能的和期望的结果类型)。
以函数式方式实现的方法
case class Person(name: String, age: Int, email: String)
def getPerson(id: Int): Future[Option[Person]] = ???
这种方法应该使用上面定义的三个API调用方法来异步地组合并返回一个人物对象,如果其中任何一个API调用失败或任何一个API调用返回None(整个人物实体无法被组合),则返回None。
要求为了性能原因,所有API调用必须以并行方式完成。
我猜最好的选择是使用Cats Semigroupal Validated,但当尝试处理Future和许多嵌套的Monads时,我就迷失了:S
是否有人可以告诉我如何实现这个(即使更改方法签名或主要概念)或指向正确的资源? 我对Cats和编码中的代数学相当新,但我想学习如何处理这种情况,以便在工作中使用它们。