'做'在Haskell构建

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)

eph*_*ent 5

你的缩进被打破了.这些更好:

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)那里结束.