【发布时间】:2018-01-07 14:16:23
【问题描述】:
使用 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 monad 用于在 API 调用期间返回可能的错误,Option 用于在 API 未找到资源时返回 None(这种情况不是错误,而是可能的和期望的结果类型)。
以函数方式实现的方法
case class Person(name: String, age: Int, email: String)
def getPerson(id: Int): Future[Option[Person]] = ???
此方法应使用上面定义的三个 API 调用方法异步组合并返回 Person 或 None 如果任何 API 调用失败或任何 API 调用返回 None(整个 Person 实体无法组合)
要求
出于性能原因,所有 API 调用都必须以并行方式完成
我的猜测
我认为最好的选择是使用 Cats Semigroupal Validated,但是在尝试处理 Future 和这么多嵌套的 Monad 时我迷路了:S
谁能告诉我你将如何实现这个(即使改变方法签名或主要概念)或指向正确的资源?我对 Cats 和 Algebra 在编码方面很陌生,但我想学习如何处理这种情况,以便我可以在工作中使用它。
【问题讨论】:
标签: scala functional-programming category-theory scala-cats