Ano*_*ard 1 io syntax monads haskell do-notation
我正在尝试学习Haskell,并希望编写一个小程序,将文件内容打印到屏幕上.当我将其加载到GHCi时,我收到以下错误:
'do'结构中的最后一个语句必须是表达式
我知道这个问题已经在这里被提出了:Haskell - "'do'结构中的最后一个语句必须是一个表达式".
即使我的代码非常相似,我仍然无法弄清楚问题.如果有人能指出我的问题,我会非常感激.
module Main (main) where
import System.IO
import System(getArgs)
main :: IO()
main = do
args <- getArgs
inh <- openFile $ ReadMode head args
printFile inh
hClose inh
printFile :: Handle -> IO ()
printFile handle = do
end <- hIsEOF handle
if end
then return ()
else do line <- hGetLine handle
putStrLn line
printFile handle
Run Code Online (Sandbox Code Playgroud)
你的缩进被打破了.这些更好:
printFile :: Handle -> IO ()
printFile handle = do
end <- hIsEOF handle
if end
then return ()
else do line <- hGetLine handle
putStrLn line
printFile handle
printFile :: Handle -> IO ()
printFile handle = do
end <- hIsEOF handle
if end
then return ()
else do
line <- hGetLine handle
putStrLn line
printFile handle
Run Code Online (Sandbox Code Playgroud)
通过if进一步缩进end <- hIsEof handle,它实际上是一个续行,而不是后续行动do.同样,你有这样的事实putStrLn line小于缩进line <- hGetLine handle意味着,do(内部else)那里结束.