主要功能的类型对我的应用程序并不意味着

type of main function doesn't mean to my application

我们知道 main 函数的类型是 IO ()。 然而,这对我来说是个问题,因为我的程序可能 return 错误。这意味着我正在从 main 函数执行类似这样的操作:

ErrorT String IO ()  

当然,此时我遇到了类型错误的问题。

我该怎么办?

args <- getArgs
s <- readFile $ head args
myFoo s

其中 myFoo :: String -> ErrorT String IO ()

你需要 运行 它 runErrorT:

runErrorT :: ErrorT e m a -> m (Either e a)

因为 myFoo returns a ErrorT String IO () 这将评估为 IO (Either String ()) ,您在 main 中执行并匹配结果:

args <- getArgs
s <- readFile $ head args
result <- runErrorT (myFoo s)
case result of
  Right _ -> putStrLn "ok!"
  Left(err) -> putStrLn $ "Error: " ++ err

要扩展@Lee 的答案,您可以使用 exitFailure and exitSuccess from System.Exit 到 return 调用进程的适当错误代码:

module Main (main) where

import Control.Monad.Error
import System.Environment
import System.Exit

myFoo :: String -> ErrorT String IO ()
myFoo = undefined

main :: IO ()
main = do
    args <- getArgs
    s <- readFile $ head args
    result <- runErrorT (myFoo s)
    case result of
        Right _ -> do
            putStrLn "OK"
            exitSuccess
        Left (e) -> do
            putStrLn $ "Error: " ++ e
            exitFailure