Haskell 嵌套在其他monad中的IO操作未执行

Haskell 嵌套在其他monad中的IO操作未执行,haskell,io-monad,Haskell,Io Monad,我有一个 foobar :: IO (ParseResult [(String,String)]) ParseResult是此处定义的单子: 我想将这些字符串写入中定义的LaTeXT m() 运行此函数不会导致创建任何文件 writeReport2 :: [Char] -> IO (ParseResult (IO ())) writeReport2 name = do x <- foobar return $ do y <- x

我有一个

foobar :: IO (ParseResult [(String,String)])
ParseResult是此处定义的单子:

我想将这些字符串写入中定义的
LaTeXT m()

运行此函数不会导致创建任何文件

writeReport2 :: [Char] -> IO (ParseResult (IO ()))
writeReport2 name = do x <- foobar
                       return $ do y <- x
                                   return $ do z <- (execLaTeXT.docAndGraph) y
                                               renderFile fileName z
  where
    fileName = name ++ ".tex"
将创建一个新文件


两组代码类型都检查

我可以让
writeReport2
不加修改地工作

我认为您可能遇到的问题是
writeresort2
的返回值中的嵌套IO操作

为了展平嵌套的
IO
操作,我必须使用以下函数:

并运行它:

λ main
创建此文件:

$ cat test.tex 
\documentclass{article}\begin{document}[(" | HaskellExample Example File\n | Two examples are given below:\n\n >>> fib 10\n 55\n\n >>> putStrLn \"foo\\nbar\"\n foo\n bar ","fib :: Int -> Int"),("\n | This is a thing: ","fib = undefined"),("\n | This is a thing:\n","fibar :: String -> Float")]\end{document}%                                                                        
我知道这不是问题的范围,但如果您愿意,可以通过这样做绕过嵌套的
IO
,例如:

writeReport3 :: [Char] -> IO ()
writeReport3 name = do
    let fileName = name ++ ".tex"
    x <- foobar
    case x of
      ParseOk y -> do
        z <- execLaTeXT (docAndGraph y)
        renderFile fileName z
      ParseFailed _ _ ->
        return ()

main :: IO ()
main = writeReport3 "test"
writeReport3::[Char]->IO()
writeReport3 name=do
让fileName=name++“.tex”
x do
Z
返回()
main::IO()
main=writeReport3“测试”

我可以让
WriterReport2
不经修改就可以工作

我认为您可能遇到的问题是
writeresort2
的返回值中的嵌套IO操作

为了展平嵌套的
IO
操作,我必须使用以下函数:

并运行它:

λ main
创建此文件:

$ cat test.tex 
\documentclass{article}\begin{document}[(" | HaskellExample Example File\n | Two examples are given below:\n\n >>> fib 10\n 55\n\n >>> putStrLn \"foo\\nbar\"\n foo\n bar ","fib :: Int -> Int"),("\n | This is a thing: ","fib = undefined"),("\n | This is a thing:\n","fibar :: String -> Float")]\end{document}%                                                                        
我知道这不是问题的范围,但如果您愿意,可以通过这样做绕过嵌套的
IO
,例如:

writeReport3 :: [Char] -> IO ()
writeReport3 name = do
    let fileName = name ++ ".tex"
    x <- foobar
    case x of
      ParseOk y -> do
        z <- execLaTeXT (docAndGraph y)
        renderFile fileName z
      ParseFailed _ _ ->
        return ()

main :: IO ()
main = writeReport3 "test"
writeReport3::[Char]->IO()
writeReport3 name=do
让fileName=name++“.tex”
x do
Z
返回()
main::IO()
main=writeReport3“测试”

您是否有解释说明嵌套导致IO操作不执行的原因?您是否有解释说明嵌套导致IO操作不执行的原因?
writeReport3 :: [Char] -> IO ()
writeReport3 name = do
    let fileName = name ++ ".tex"
    x <- foobar
    case x of
      ParseOk y -> do
        z <- execLaTeXT (docAndGraph y)
        renderFile fileName z
      ParseFailed _ _ ->
        return ()

main :: IO ()
main = writeReport3 "test"