簡體   English   中英

在Haskell中對個案聲明采取的多項行動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM