稍后从 IO 操作中解包值

Unwrap value from IO operation at a later time

你好,我想知道你以后如何在 IO monad 中解包一个值? 如果 a<-expression 将结果绑定到 a 那么我不能使用 (<-expression) 作为给定方法的参数,例如: method (<-expression) 方法 method 接受评估结果的地方?

代码

let inh=openFile "myfile" WriteMode
let outh=openFile "out.txt" WriteMode 
hPutStrLn (<-outh) ((<-inh)>>=getLine)

我没有进入 Monad 章节,只是基本的 <-do 块,但我想它与 monad 有关。 然后,如果我想通过 result 如果对 hGetLine 的评估不能使用类似的东西:

(<-expression)=>>hGetLine

你已经明白 <- 运算符有点解包 IO 值,但它实际上是 do 符号的语法,可以这样表达(实际上我不确定,这是你想要达到的结果,但下面的例子只是从一个文件中读取内容并将内容放入另一个文件中):

import System.IO

main = do
  inh <- openFile "myfile" ReadMode
  outh <- openFile "out.txt" WriteMode
  inContent <- hGetLine inh
  hPutStrLn outh inContent
  hClose outh

根据 documentation hGetLinehPutStrlLnhClose 接受 Handle 类型的值作为参数,但是 openFile returns IO Handle,所以我们需要使用 <- operator

解包

但是如果您想改用 >>= 函数,那么这是执行此操作的选项之一:

import System.IO

writeContentOfMyFile :: Handle -> IO ()
writeContentOfMyFile handler =
  openFile "myfile" ReadMode >>= hGetLine >>= hPutStrLn handler

main =
  withFile "out.txt" WriteMode writeContentOfMyFile