对Haskell中的case语句的多个动作

时间:2010-05-16 11:11:05

标签: function haskell io

晚上的最后一个问题,我正在构建我的Haskell程序的主要输入功能,我必须检查引入的args

所以我用

args <- getArgs
case length args of
    0 -> putStrLn "No Arguments, exiting"
    otherwise -> { other methods here}

是否有一种设置其他方法的智能方法,或者编写一个其他案例被抛入主要内容的函数是否符合我的最佳利益?

或者是否有更好的解决案件问题的方法。我只需要一个名字。

3 个答案:

答案 0 :(得分:10)

args <- getArgs
case length args of
    0 -> putStrLn "No Arguments, exiting"
    otherwise -> do
        other
        methods
        here

答案 1 :(得分:2)

参数处理应该在一个单独的函数中隔离。 除此之外,很难概括,因为有很多不同的处理参数的方法。 以下是一些值得考虑的类型签名:

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")

我会把其他人留给你的想象力。

  

编写一个将另一个案例抛到main中的函数是否符合我的最佳利益?

是。此外,您应该构建一个组合器库,您可以调用它来轻松处理命令行参数,适用于各种程序。毫无疑问,这些库已经存在于Hackage上,但这是其中一种情况,它可能比学习别人的API更容易推出自己的(并且它肯定会更有趣)。

答案 2 :(得分:0)

View Patterns可能会对此有所帮助。