为什么zio的putStrLn没有输出
Why putStrLn of zio didn't output
为什么 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)
}
或者您可以将效果放入单独的平面地图中。但是因为你想创建副作用(通过打印值),然后传递值进一步不变,你需要使用特殊函数 tap
:
def main1(args: Array[String]) = getStrLn.tap { s =>
putStrLn(s)
}.flatMap { s =>
UIO.succeed(s)
}
此 great article 中也描述了您的问题(以及其他陷阱)(查看第一点)。
为什么 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)
}
或者您可以将效果放入单独的平面地图中。但是因为你想创建副作用(通过打印值),然后传递值进一步不变,你需要使用特殊函数 tap
:
def main1(args: Array[String]) = getStrLn.tap { s =>
putStrLn(s)
}.flatMap { s =>
UIO.succeed(s)
}
此 great article 中也描述了您的问题(以及其他陷阱)(查看第一点)。