主要功能的类型对我的申请并不意味着什么

时间:2016-04-25 14:45:04

标签: haskell io monads

我们知道main函数的类型为IO ()。 但是,这对我来说是个问题,因为我的程序可能会返回错误。这意味着我正在从main函数执行类似的东西:

ErrorT String IO ()  

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

我该怎么办?

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

myFoo :: String -> ErrorT String IO ()

2 个答案:

答案 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中的exitSuccessSystem.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