如何在Scala中链接Future [\ / [A,B]]?

约翰尼·埃弗森(Johnny Everson)

我如何for对类型的数据进行理解Future[\/[String,Int]]

这是一个起点,尚未编译。

import scala.concurrent.{ExecutionContext,future,Future}
import scalaz._
import Scalaz._
import ExecutionContext.Implicits.global

def calculateStuff(i:Int):Future[\/[String,Int]] = future{\/-(i)}

for {
   v1Either <- calculateStuff(1)
   v1Int <- v1Either
   v2Either < calculateStuff(v1Int)
   v2Int <- v2Either
   v3Either <- calculateStuff(v2Int)
   v3Int <- v3Either
} yield {
   v1Int + v2Int + v3Int
}

注意:calculateStuff这只是一个示例,实际上会有不同的功能,每个功能都取决于前一个的结果。

特拉维斯·布朗

首先,我假设您有充分的理由实施自己的错误处理(通过\/),而不是使用内置的功能Future

如果是这种情况,那么正如您的标签所暗示的那样,此类问题正是monad转换器的目的-只需将您的计算结果包装在中即可EitherT

import scalaz._, Scalaz._, contrib.std._
import scala.concurrent.{ ExecutionContext, future, Future }
import ExecutionContext.Implicits.global

def calculateStuff(i: Int): EitherT[Future, String, Int] =
  EitherT(future(\/-(i)))

val computation = for {
   v1Int <- calculateStuff(1)
   v2Int <- calculateStuff(v1Int + 1)
   v3Int <- calculateStuff(v2Int + 2)
} yield v1Int + v2Int + v3Int

请注意,我使用的Monad实例FutureTypelevelscalaz-的contrib库。

现在computation.run会给你一个Future[String \/ Int]

如果您需要向计算中注入纯值,则可以使用point和lambda类型:

v4Int <- 1.point[({ type L[x] = EitherT[Future, String, x] })#L]

您也可以定义自己的类型别名,以使外观更好看。

如果要\/for-comprehension中使用值,则可以Future将其指向并包装整个内容EitherT

v5Int <- EitherT(1.right[String].point[Future])

也可以Future使用(有点易混淆的名字)将一个普通的旧的东西提升到转换后的monad中liftM

v6Int <- future(1).liftM[({ type T[m[+_], a] = EitherT[m, String, a] })#T]

在这种情况下,您几乎可以肯定要使用类型别名-该行主要是噪音。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

“ a <= b && b <= a && a!= b”如何成立?

来自分类Dev

如果C中a%b == 0,floor(a /(double)b)* b == a?

来自分类Dev

如何使add(a)(b)等于a + b?

来自分类Dev

Python的a,b = b,a如何工作?

来自分类Dev

如何在链接列表[(a,b),(b,c),(c,d)]中的开始和结束值时对元组进行排序?

来自分类Dev

[A,Future [B]]到Future [E [[A,B]]

来自分类Dev

如何在Haskell中理解“(Num b)=>长度:: [a]-> b”?

来自分类Dev

在Javascript中,为什么要写'b || (b = a);'?

来自分类Dev

在python中[[[a,a,a]','[b,b,b]']和[[a,a,a],[b,b,b]]有什么区别?

来自分类Dev

Python正则表达式中的\ B +与[\ B] +与[^ \ b] +

来自分类Dev

在重复键更新中a = VALUES(b)与a = b

来自分类Dev

Scala中f(a,b)和f(a)(b)之间的差异

来自分类Dev

Scala类型不匹配找到Future [A]预期Future [B]

来自分类Dev

如何在自助数据uri中获取Azure AAD B2C忘记密码的链接

来自分类Dev

如何在`let a:&A =&b;`中将'&b`强制转换为对'b:B`的`&A`?

来自分类Dev

如何在Buefy中添加b表列?

来自分类Dev

我应该如何获得B表格A => B

来自分类Dev

如何从B继承B的同时继承B的类A?

来自分类Dev

如果C中a%b == 0,floor(a /(double)b)* b == a?

来自分类Dev

如何找到大a和b的(a * b)%m?

来自分类Dev

如何在/ C中运行从/ A到/ B的符号链接

来自分类Dev

在Scala中,如何创建TypeTag [Map [A,B]],而只有TypeTag [A]和TypeTag [B]可用?

来自分类Dev

Python正则表达式中的\ B +与[\ B] +与[^ \ b] +

来自分类Dev

如何在Scala中打开Option [Map(A,B)]?

来自分类Dev

如何在给定的 Future[Try[Option[A]]] 上应用类型 A => Future[Try[Option[B]]] 的函数?

来自分类Dev

如何在 C 中评估“a<b<c”或“a>b>c”

来自分类Dev

JavaScript 中的链接 A/B 测试

来自分类Dev

如何从 ('a', 'b', 'c') 得到 ('a', 'a/b', 'a/b/c')?

来自分类Dev

如何在A之前登录B?

Related 相关文章

  1. 1

    “ a <= b && b <= a && a!= b”如何成立?

  2. 2

    如果C中a%b == 0,floor(a /(double)b)* b == a?

  3. 3

    如何使add(a)(b)等于a + b?

  4. 4

    Python的a,b = b,a如何工作?

  5. 5

    如何在链接列表[(a,b),(b,c),(c,d)]中的开始和结束值时对元组进行排序?

  6. 6

    [A,Future [B]]到Future [E [[A,B]]

  7. 7

    如何在Haskell中理解“(Num b)=>长度:: [a]-> b”?

  8. 8

    在Javascript中,为什么要写'b || (b = a);'?

  9. 9

    在python中[[[a,a,a]','[b,b,b]']和[[a,a,a],[b,b,b]]有什么区别?

  10. 10

    Python正则表达式中的\ B +与[\ B] +与[^ \ b] +

  11. 11

    在重复键更新中a = VALUES(b)与a = b

  12. 12

    Scala中f(a,b)和f(a)(b)之间的差异

  13. 13

    Scala类型不匹配找到Future [A]预期Future [B]

  14. 14

    如何在自助数据uri中获取Azure AAD B2C忘记密码的链接

  15. 15

    如何在`let a:&A =&b;`中将'&b`强制转换为对'b:B`的`&A`?

  16. 16

    如何在Buefy中添加b表列?

  17. 17

    我应该如何获得B表格A => B

  18. 18

    如何从B继承B的同时继承B的类A?

  19. 19

    如果C中a%b == 0,floor(a /(double)b)* b == a?

  20. 20

    如何找到大a和b的(a * b)%m?

  21. 21

    如何在/ C中运行从/ A到/ B的符号链接

  22. 22

    在Scala中,如何创建TypeTag [Map [A,B]],而只有TypeTag [A]和TypeTag [B]可用?

  23. 23

    Python正则表达式中的\ B +与[\ B] +与[^ \ b] +

  24. 24

    如何在Scala中打开Option [Map(A,B)]?

  25. 25

    如何在给定的 Future[Try[Option[A]]] 上应用类型 A => Future[Try[Option[B]]] 的函数?

  26. 26

    如何在 C 中评估“a<b<c”或“a>b>c”

  27. 27

    JavaScript 中的链接 A/B 测试

  28. 28

    如何从 ('a', 'b', 'c') 得到 ('a', 'a/b', 'a/b/c')?

  29. 29

    如何在A之前登录B?

热门标签

归档