主要功能的类型对我的应用程序并不意味着
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
我们知道 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