在Zio中输入推断以进行理解
因此,我写了一种方法来计算Zio中文件中的行数。
def lines(file: String): Task[Long] = {
def countLines(reader: BufferedReader): Task[Long] = Task.effect(reader.lines().count())
def releaseReader(reader: BufferedReader): UIO[Unit] = Task.effectTotal(reader.close())
def acquireReader(file: String): Task[BufferedReader] = Task.effect(new BufferedReader(new FileReader(file), 2048))
Task.bracket(acquireReader(file), releaseReader, countLines)
}
现在,当我尝试以这样的方式提取结果时,在我的运行方法中:
for {
lines <- linesV3("src/main/scala/FileIO.scala") //Type of lines showing as Any
_ <- putStrLn(lines.toString) //This line throws error as it cannot convert Any to String
}
线的类型正在出现,而不是长。为什么这样? 如果我使用flatmap,则可以正确推断该类型。
So I have written a method to count the number of lines in a file in ZIO.
def lines(file: String): Task[Long] = {
def countLines(reader: BufferedReader): Task[Long] = Task.effect(reader.lines().count())
def releaseReader(reader: BufferedReader): UIO[Unit] = Task.effectTotal(reader.close())
def acquireReader(file: String): Task[BufferedReader] = Task.effect(new BufferedReader(new FileReader(file), 2048))
Task.bracket(acquireReader(file), releaseReader, countLines)
}
Now inside my run method when I try to extract the result like this:
for {
lines <- linesV3("src/main/scala/FileIO.scala") //Type of lines showing as Any
_ <- putStrLn(lines.toString) //This line throws error as it cannot convert Any to String
}
The type of lines is coming as Any instead of Long. Why is this so?
If I use flatMap then the type is inferred correctly.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您在此处发布的代码没有问题。该问题必须来自您计划中的其他地方。
也许您在理解后缺少收益率。我不知道这是否是复制错误。
There's no problem with the code you posted here. The issue must be arising from somewhere else in your program.
Maybe you are missing the yield after the for comprehension. I don't know if that is a copying error.
因此,解决方案相当相似。
在理解后,我一旦添加一个收益率,类型推理就开始正确地工作,
因为PutStrln仅接受字符串参数,因此需要使用Tostring方法。
so the solution was fairly similar.
As soon as I add a yield after the for comprehension the type inference starts working correctly
The toString method is required because putStrLn accepts only String parameters.