【问题标题】:Output value of type A as result类型 A 的输出值作为结果
【发布时间】:2020-03-03 09:44:52
【问题描述】:

我在 IDEA(scala 研讨会)中有下一个代码,

import zio.console.Console
import zio.{IO, Task, ZIO}

val st :Seq[Task[Int]] = Seq(Task(1),Task(2),Task(3))

val t : Task[List[Int]]= IO.collectAll(st)

val r : ZIO[Console, Throwable, List[Int]] = t

r.fold(
  f => {
    println(s"fail f=$f");
    0
  },
  s => {
    println(s"success res = ${s.sum}");
    1
  }
)

你能帮我解决一下输出结果吗(预计 6 个)

我有输出

st: Seq[zio.Task[Int]] = List(zio.ZIO$EffectPartial@263c8be8, zio.ZIO$EffectPartial@469dccd5, zio.ZIO$EffectPartial@1a56563e)

t: zio.Task[List[Int]] = zio.ZIO$FlatMap@1e8d80f2
r: zio.ZIO[zio.console.Console,Throwable,List[Int]] = zio.ZIO$FlatMap@1e8d80f2

res0: zio.ZIO[zio.console.Console,Nothing,Int] = <function1>

【问题讨论】:

    标签: scala zio


    【解决方案1】:

    zio.ZIO(link)中的方法fold定义为:

    final def fold[B](failure: E => B, success: A => B): ZIO[R, Nothing, B]
    

    此签名表明该方法完全返回您收到的类型zio.ZIO[zio.console.Console, Nothing, Int]

    您可以像这样在默认运行时运行效果:

    import zio.DefaultRuntime
    
    val runtime = new DefaultRuntime {}
    
    runtime.unsafeRun(effect)
    

    上面的代码打印出“success res = 6”。

    【讨论】:

      【解决方案2】:

      本质上,包括collectAllfold 在内的所有ZIO 操作都是对函数的操作,因为每个ZIO 本质上基本上都是一个异想天开的函数。在您的情况下,ZIO[Console, Throwable, List[Int]] 是一个函数,其中 Console 是输入参数,Throwable/List[Int] 是两种可能的输出类型之一。当您使用 collectAllfold 之类的组合子时,您基本上会在其他函数的基础上构造一个新函数。

      下一步是通过将输入参数传递给这个新函数来评估它。在您的情况下,此输入参数是扩展 Console 类型的任何特征。正如@slouc 在他的回答中所反映的那样,您可以在您的res0 上使用DefaultRuntime“跑步者”,因为此跑步者提供的默认环境(函数的输入参数)实现了Console 特征。

      import zio.DefaultRuntime
      
      val runtime = new DefaultRuntime {}
      
      runtime.unsafeRun(res0) 
      

      还有另一种更明确的方法可以通过使用 ZIO#provide 来提供这个 Env,但是之后您仍然需要一些运行时来执行这个函数。

      我还想指出,当您在 fold 中执行 println 时,实际上并没有使用您提供作为输入参数的 Console 特征,而是使用本机 scala 提供的常规 println反而。在您的基本情况下,这无关紧要,但在实际应用程序中,您需要使用Console 提供的putStrLn

      【讨论】:

        猜你喜欢
        • 2010-10-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        • 1970-01-01
        相关资源
        最近更新 更多