加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala中堆叠应用程序函子

发布时间:2020-12-16 09:42:03 所属栏目:安全 来源:网络整理
导读:当您的计算步骤独立时,应用函数通常被提及作为单体的替代方法。他们经常提到的优点之一是,当您要堆叠应用程序时,您不需要变压器,因为F [G [X]]总是也是适用的。 假设我有以下功能: def getDataOption(): Option[Data]def getUserFuture(): Future[User]
当您的计算步骤独立时,应用函数通常被提及作为单体的替代方法。他们经常提到的优点之一是,当您要堆叠应用程序时,您不需要变压器,因为F [G [X]]总是也是适用的。
假设我有以下功能:

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

为了获得未来[选项[用户]]和未来[选项[数据]],我希望优雅的堆叠,并与进程映射。

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

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 _)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读