这是一个如何使用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"
如果您将bleeps 和bloops 替换为a 和b,您可以使用例如运行程序
$ stack run -- --a 30 --b 20