【问题标题】:How to check the number of command-line arguments?如何检查命令行参数的数量?
【发布时间】:2021-03-09 08:25:09
【问题描述】:

我有一个 Haskell 语言项目,但我对这项技术不是很有经验。

我的程序必须有 5 个命令行参数(包括二进制),它应该像下面一行:

./my_program --a 30 --b 20

如何检查参数的数量(如果 arguments != 5 则返回错误)?

我知道getargs 函数,但我不知道如何使用它。

【问题讨论】:

    标签: haskell error-handling io command-line-arguments


    【解决方案1】:

    这是一个如何使用getArgs的示例:

    module Main where
    
    import System.Environment (getArgs)
    
    main :: IO ()
    main = do
      args <- getArgs
      if length args == 5
        then putStrLn "You gave me 5 args!"
        else putStrLn "You didn't give me 5 args!"
    

    编辑:length args,不是args,谢谢。

    编辑:但是请注意,./my_program --a 30 --b 20 上的 getArgs 与 C 语言不同,不会将 ./my_program 作为参数的一部分。如果您想要程序名称,它是getProgName。否则,正确的数字可能是 4。为了使用 IO monad,您可以扩展程序以打印出可执行文件的名称:

    import System.Environment (getArgs, ...)
    
    main = IO ()
    main = do
      args <- getArgs
      name <- ...
    
      putStrLn ("Program: " <> show name)
      if length args == 4
        ...
    

    但您似乎想要的是参数解析,而不仅仅是计数。

    您可以使用optparse-generic 根据数据类型自动生成参数解析器。

    Options.Generic 的文档中有一个示例,我将其转换为模板项目here,其重要部分为后人提及:

    {-# LANGUAGE DataKinds #-}
    {-# LANGUAGE DeriveGeneric #-}
    {-# LANGUAGE FlexibleInstances #-}
    {-# LANGUAGE OverloadedStrings #-}
    {-# LANGUAGE StandaloneDeriving #-}
    {-# LANGUAGE TypeOperators #-}
    
    module Main where
    
    import Control.Monad.IO.Class (MonadIO)
    import Options.Generic
    
    data Config w = Config
      { bleeps :: w ::: Int <?> "Number of bleeps"
      , bloops :: w ::: Int <?> "Number of bloops"
      } deriving (Generic)
    
    instance ParseRecord (Config Wrapped)
    deriving instance Show (Config Unwrapped)
    
    main :: IO ()
    main = do
      config <- getConfig
      putStrLn $
        "I got " <> show (bleeps config) <> " bleeps, and "
                 <> show (bloops config) <> " bloops."
    
    getConfig :: IO (Config Unwrapped)
    getConfig = unwrapRecord "Hello"
    

    如果您将bleepsbloops 替换为ab,您可以使用例如运行程序

    $ stack run -- --a 30 --b 20
    

    【讨论】:

      猜你喜欢
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 2017-04-11
      • 2014-02-16
      • 2011-06-24
      • 1970-01-01
      相关资源
      最近更新 更多