稍后从IO操作中释放价值

时间:2018-07-24 06:32:45

标签: haskell io-monad

您好,我想知道您以后如何在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

1 个答案:

答案 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 hGetLinehPutStrlLnhClose接受Handle类型的值作为参数,但是openFile返回{{1 }},因此我们需要使用IO Handle运算符

对其进行解包

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

>>=