在Zio中输入推断以进行理解

发布于 2025-01-25 12:38:32 字数 802 浏览 4 评论 0原文

因此,我写了一种方法来计算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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏花。依旧 2025-02-01 12:38:32

您在此处发布的代码没有问题。该问题必须来自您计划中的其他地方。
也许您在理解后缺少收益率。我不知道这是否是复制错误。

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.

吝吻 2025-02-01 12:38:32

因此,解决方案相当相似。
在理解后,我一旦添加一个收益率,类型推理就开始正确地工作,

for {
  lines <- linesV3("src/main/scala/FileIO.scala")
  _ <- putStrLn(lines.toString)
} yield ()

因为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

for {
  lines <- linesV3("src/main/scala/FileIO.scala")
  _ <- putStrLn(lines.toString)
} yield ()

The toString method is required because putStrLn accepts only String parameters.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文