我getOpt用來決議和驗證getArgs.
我選擇使用基于動作的方法getOpt,這里是型別。
data Options = Options { afield :: foo, bfield :: bar}
type Action = Either String (Options -> Options)
然后我使用折疊默認選項記錄上的操作串列,
evaluateActions :: Either [String] Options -> Action -> Either [String] Options
evaluateActions (Left errors) (Left err) = Left $ err:errors
evaluateActions (Left errors) (Right _) = Left errors
evaluateActions (Right _) (Left err) = Left [err]
evaluateActions (Right option) (Right action) = Right $ action option
之后我留下了所需的型別Either [String] Options。出現錯誤時,我想列印字串并以錯誤代碼 InvalidArgument 退出。
printErrorsThenExit :: [String] -> ExitCode -> IO ()
printErrorsThenExit errs code =
hPutStr stderr (concat errs) >>
exitWith code
我正在努力在我的主要功能中將其粘合在一起,而沒有撰寫類似以下不適用于型別的內容:
opts <- case result of
Left errors -> printErrorsThenExit errors illegalArgument
Right options -> return options
我已經看到了這個when功能,但我認為它沒有幫助,因為我需要打開 Either。
有人知道我如何在 Haskell 中表達失敗程序嗎?
uj5u.com熱心網友回復:
既然我們有
exitWith :: ExitCode -> IO a
您可以簡單地將您的printErrorsThenExit型別更改為
printErrorsThenExit :: [String] -> ExitCode -> IO a
-- ^ --
關鍵是:如果一個 IO 操作實際上沒有回傳(但退出整個程式),它的型別可以是IO afor any a,聲稱它可以適合任何型別。
然后,您的main代碼應該按原樣作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/496432.html
標籤:哈斯克尔
