您好,我想知道您以后如何在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
答案 0 :(得分:3)
您已经了解到<-
运算符可以解开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
返回{{1 }},因此我们需要使用IO Handle
运算符
但是,如果您想改用<-
函数,那么这是执行此操作的选项之一:
>>=