ZIO 中的类型推断提供 Any 以供理解
Type inference in ZIO giving Any in for comprehension
所以我在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
}
行的类型为 Any 而不是 Long。为什么会这样?
如果我使用 flatMap 则可以正确推断类型。
您在此处发布的代码没有问题。问题一定是由程序中的其他地方引起的。
也许您在 for 理解之后错过了 yield 。不知道是不是复制错误
所以解决方案非常相似。
只要我在 for comprehension 之后添加一个 yield,类型推断就会开始正常工作
for {
lines <- linesV3("src/main/scala/FileIO.scala")
_ <- putStrLn(lines.toString)
} yield ()
需要 toString 方法,因为 putStrLn 只接受字符串参数。
所以我在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
}
行的类型为 Any 而不是 Long。为什么会这样? 如果我使用 flatMap 则可以正确推断类型。
您在此处发布的代码没有问题。问题一定是由程序中的其他地方引起的。 也许您在 for 理解之后错过了 yield 。不知道是不是复制错误
所以解决方案非常相似。 只要我在 for comprehension 之后添加一个 yield,类型推断就会开始正常工作
for {
lines <- linesV3("src/main/scala/FileIO.scala")
_ <- putStrLn(lines.toString)
} yield ()
需要 toString 方法,因为 putStrLn 只接受字符串参数。