如何在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 _) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |