gpt4 book ai didi

scala - 如何在 Scala 中堆叠应用仿函数

转载 作者:行者123 更新时间:2023-12-03 10:30:03 26 4
gpt4 key购买 nike

当您的计算步骤是独立的时,应用仿函数经常被提及作为 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 _)

关于scala - 如何在 Scala 中堆叠应用仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36751784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com