繁体   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