我们知道main函数的类型为IO ()
。
但是,这对我来说是个问题,因为我的程序可能会返回错误。这意味着我正在从main函数执行类似的东西:
ErrorT String IO ()
当然,此刻我遇到了类型错误的问题。
我该怎么办?
args <- getArgs
s <- readFile $ head args
myFoo s
myFoo :: String -> ErrorT String IO ()
答案 0 :(得分:6)
您需要使用runErrorT
:
runErrorT :: ErrorT e m a -> m (Either e a)
由于myFoo
返回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
答案 1 :(得分:3)
要扩展@ Lee的答案,您可以使用exitFailure
中的exitSuccess
和System.Exit
向调用进程返回相应的错误代码:
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