稍后从 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 hGetLine
,hPutStrlLn
和 hClose
接受 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
你好,我想知道你以后如何在 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 hGetLine
,hPutStrlLn
和 hClose
接受 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