kci*_*ski 26 scala scalaz scala-cats
当您的计算步骤是独立的时,通常会提到应用仿函数作为monad的替代.他们经常提到的一个优点是,当你想要堆叠应用程序时,你不需要变换器,因为F[G[X]]它总是一个应用程序.假设我有以下功能:
def getDataOption(): Option[Data]
def getUserFuture(): Future[User]
def process(data: Data, user: User)
Run Code Online (Sandbox Code Playgroud)
我想有优雅的堆叠,以获得Future[Option[User]]与Future[Option[Data]]和地图与process.
到目前为止,我只想出了这个(使用Cats):
Applicative[Future]
.compose[Option]
.map2(
Applicative[Future].pure(getDataOption()),
getUserFuture().map(Applicative[Option].pure))(process)
Run Code Online (Sandbox Code Playgroud)
但我相信这远非理想.是否有更优雅和通用的方式来实现相同的目标?
这里最困难的是类型推断。这是我能做的最好的事情
// 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 _)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
828 次 |
| 最近记录: |