为什么zio的putStrLn没有输出

时间:2020-04-05 06:24:42

标签: scala zio

为什么flatMap中的putStrLn后跟结果语句没有有效地写入stdout?

object Mgr extends App {

  def main1(args: Array[String]) = getStrLn.flatMap { s =>
    putStrLn(s)  // Why this did not write to console?
     UIO.succeed(s)
  }

  override def run(args: List[String]): URIO[zio.ZEnv, Int] = main1(Array()).fold(_ => 1,
    { x =>
       println(x)  // only this line wrote to console, why?
      0
    })
}

1 个答案:

答案 0 :(得分:6)

基本上,您的问题是,将两个效果放入单个flatMap中。

通过调用putStrLn(s),您实际上并没有打印到控制台,而只是创建了对动作的描述,该动作将在解释和运行程序(调用方法run时)后打印。 。而且由于在平面图中仅返回最后一个值(在您的情况下为UIO.succeed(s)),因此在构造ZIO程序时仅将其考虑在内。

您可以通过链接两个动作来修复程序。

您可以使用*>运算符来完成此操作:

def main1(args: Array[String]) = getStrLn.flatMap { s =>
    putStrLn(s)  *>  UIO.succeed(s)
}

或者您可以将效果放入单独的flatMap中。但是,由于要创建副作用(按打印值),然后又使值进一步不变,因此需要使用特殊功能tap

def main1(args: Array[String]) = getStrLn.tap { s =>
    putStrLn(s)
}.flatMap { s =>
    UIO.succeed(s)
}

great article(请看第一点)也描述了您的问题(有其他陷阱)。

相关问题