[英]Multiple actions upon a case statement in Haskell
晚上的最后一個問題是,我正在構建Haskell程序的主要輸入功能,並且必須檢查引入的args。
所以我用
args <- getArgs
case length args of
0 -> putStrLn "No Arguments, exiting"
otherwise -> { other methods here}
是否存在設置其他方法的明智方法,或者對我而言,編寫在主程序中拋出其他情況的函數是我的最大利益?
還是有更好的解決案件問題的方法。 我只想取一個名字。
args <- getArgs
case length args of
0 -> putStrLn "No Arguments, exiting"
otherwise -> do
other
methods
here
參數處理應隔離在單獨的函數中。 除此之外,很難一概而論,因為處理參數的方法有很多。 以下是一些值得考慮的類型簽名:
exitIfNonempty :: [Arg] -> IO [Arg] -- return args unless empty
processOptions :: [Arg] -> (OptionRecord, [Arg]) -- convert options to record,
-- return remaining args
processOptionsBySideEffect :: [Arg] -> State [Arg] -- update state from options,
-- return remaining args
callFirstArgAsCommand :: [(Name, [Arg] -> IO ())] -> [Arg] -> IO ()
以及一些實現的草圖(此代碼在編譯器附近都沒有):
exitIfNonempty [] = putStrLen "No arguments; exiting"
exitIfNonempty args = return args
callFirstArgAsCommand commands [] = fail "Missing command name"
callFirstArgAsCommand commands (f:as) =
case lookup f commands in
Just f -> f as
Nothing -> fail (f ++ " is not the name of any command")
我會讓其他人留給您想象。
為了我的最大利益,編寫一個在主程序中拋出其他情況的函數?
是。 此外,您應該為各種程序建立一個組合程序庫,可以輕松調用該組合程序以處理命令行參數。 這樣的庫無疑已經存在於Hackage上 ,但這是其中一種情況,其中滾動自己的庫可能比學習別人的API容易(肯定會更有趣)。
視圖模式在這里可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.