Scala 2.12组合Future和Either(有偏见的版本)
发布时间:2020-12-16 18:13:25 所属栏目:安全 来源:网络整理
导读:我有两个方法,两个都返回Future [Either [String,T]],并希望将它们链接在一起以完成工作.我正在使用 Scala 2.12现在两者都是正确的偏见. 例如, 如果函数没有返回Future和Either组合,我可以简单地执行以下操作以获得理解. def convert(a,b) = ???def callA():
我有两个方法,两个都返回Future [Either [String,T]],并希望将它们链接在一起以完成工作.我正在使用
Scala 2.12现在两者都是正确的偏见.
例如, 如果函数没有返回Future和Either组合,我可以简单地执行以下操作以获得理解. def convert(a,b) = ??? def callA(): Future[A] = ??? def callB(a: A): Future[B] = ??? def chain: Future[C] = for { a <- callA b <- callB(a) } yield convert(a,b) 但现在我想用以下语法使用Either捕获错误,并传播到最终结果.实现这一目标的最佳方法是什么?还应该使用callB还是callB1? def convert(a,b): Future[Either[String,C]] = ??? def callA(): Future[Either[String,A]] = ??? def callB(a: A): Future[Either[String,B]] = ??? or def callB1(eithera: Either[String,A]): Future[Either[String,B]] = ??? 我知道使用cat变换monad可以简化这一点.欢迎给我使用标准库和猫的解决方案. 解决方法
正如评论所提到的,这是猫和scalaz可以处理的东西.但我也能理解不要为一小段逻辑引入另一个依赖或复杂的愿望.如果您想自己实现,可以执行以下操作:
implicit class FutureEither[A](val wrapped: Future[Either[String,A]])(implicit ec: ExecutionContext) { def map[B](f: A => B): FutureEither[B] = wrapped.map(_.map(f)) def flatMap[B](f: A => FutureEither[B]): FutureEither[B] = wrapped.flatMap { case Left(s) => Future(Left(s)) case Right(a) => f(a).wrapped } } 使用适当的类型实现map和flatMap可以实现完全相同的for-understanding理解: def convert(a: A,b: B): C = ??? def callA(): FutureEither[A] = ??? def callB(a: A): FutureEither[B] = ??? def chain: FutureEither[C] = for { a <- callA() b <- callB(a) } yield convert(a,b) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 经常使用的查询的psql快捷方式? (比如Unix“别名”)
- angularjs – 角度简单路由不起作用
- 4.6Webservice
- 在supportedSASLMechanisms中将GSSAPI添加到OpenLdap
- angular1.x和angular2+并行,angular1.x 升级 angular2+方案
- angularjs – Express.js和Angular.js项目的文件夹结构
- Bootstrap学习总结笔记(20)-- 基本插件之Alert警告框
- 模态对话框 – 如何垂直对齐Bootstrap v4模式对话框
- Linux下查看.so和可执行文件是否debug编译的方法(必看)
- 表演 – 为什么高粱比斯卡拉慢?