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"