繁体   English   中英

如何在Scala中堆叠applicative functor

[英]How to stack applicative functors in Scala

当您的计算步骤是独立的时,通常会提到应用仿函数作为monad的替代。 他们经常提到的一个优点是,当你想要堆叠应用程序时,你不需要变换器,因为F[G[X]]总是一个应用程序。 假设我有以下功能:

def getDataOption(): Option[Data]
def getUserFuture(): Future[User]
def process(data: Data, user: User)

我希望有一个优雅的堆叠,以获得Future[Option[User]]Future[Option[Data]]并将其映射到process

到目前为止,我只想出了这个(使用Cats):

Applicative[Future]
  .compose[Option]
    .map2(
      Applicative[Future].pure(getDataOption()),
      getUserFuture().map(Applicative[Option].pure))(process)

但我相信这远非理想。 是否有更优雅和通用的方式来实现相同的目标?

最难的是这里的类型推断。 这是我能做的最好的事情

  // for the Applicative[Future[Option[?]]
  import cats.Applicative

  implicit val fo = {
    import cats.std.future._
    import cats.std.option._
    Applicative[Future].compose[Option]
  }

  // for the |@| syntax
  import cats.syntax.cartesian._

  // to guide type inference
  type FutureOption[A] = Future[Option[A]]

  ((Future(getDataOption): FutureOption[Data]) |@|
    getUserFuture.map(Option.apply)).map(process _)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM