gpt4 book ai didi

scala - 为什么zio的putStrLn没有输出

转载 作者:行者123 更新时间:2023-12-05 09:10:44 25 4
gpt4 key购买 nike

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

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
})
}

最佳答案

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

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

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

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

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

或者您可以将效果放入单独的平面 map 中。但是因为你想产生副作用(通过打印值),然后传递值不变,你需要使用特殊函数tap:

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

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

关于scala - 为什么zio的putStrLn没有输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61038808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com