【发布时间】:2016-04-20 18:06:01
【问题描述】:
当您的计算步骤是独立的时,应用函子经常被提及作为 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)
但我确信这远非理想。有没有更优雅和通用的方法来实现同样的目标?
【问题讨论】:
标签: scala scalaz scala-cats