1

您好,我想知道您以后如何在 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章节,但我想它与单子有关。然后,如果我想通过if 评估,我不能使用类似的东西:<-doresulthGetLine

(<-expression)=>>hGetLine
4

1 回答 1

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

根据文档 hGetLinehPutStrlLnhClose接受Handle类型的值作为参数,但openFile返回IO Handle,所以我们需要使用<-运算符解开它

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

import System.IO

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

main =
  withFile "out.txt" WriteMode writeContentOfMyFile
于 2018-07-24T07:51:19.887 回答