gpt4 book ai didi

haskell - 如何检查命令行参数的数量?

转载 作者:行者123 更新时间:2023-12-05 01:08:04 25 4
gpt4 key购买 nike

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

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

./my_program --a 30 --b 20

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

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

最佳答案

这是一个如何使用 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

关于haskell - 如何检查命令行参数的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66543238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com