haskell 带有cmd的强制参数

j9per5c4  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(163)

使用cmdargs时,如果缺少一个强制参数,是否有一种方便的方法可以打印错误消息并退出?例如,现在我有这样的代码:

foo = Foo{script = def &= args &= typ "SCRIPT"}

main = do
   scriptName <- script <$> cmdArgs foo
   -- ...

如果我运行这个程序并且不传递SCRIPT参数,scriptName就是一个空字符串,我真的需要手动检查并使用Control.Monad.Except之类的东西来处理吗?

thtygnil

thtygnil1#

部分的,因此有点不满意的解决办法。

{-# LANGUAGE DeriveDataTypeable #-}

module Main where

import Control.Monad
import System.Console.CmdArgs
import System.Console.CmdArgs.Explicit
import System.IO

helpAndExit :: (Data a) => String -> a -> IO ()
helpAndExit msg args =
    do
    let cm = cmdArgsMode args
    let ht = msg ++ "\n\n"
             ++ show cm
    cmdArgsApply (CmdArgs{cmdArgsValue=args,
                          cmdArgsHelp = Just ht,
                          cmdArgsVersion = Nothing,
                          cmdArgsVerbosity = Nothing } )
    return ()

data FooArgs = FooArgs{script :: String, thing :: String }
           deriving (Show, Data, Typeable)

fooArgs = cmdArgsMode $ FooArgs{
                    script = def &= typ "SCRIPT" &= help "Script",
                    thing = def &= help "Thing"
                }

main :: IO()
main = do
    ca <- cmdArgsRun fooArgs
    let scriptName = script ca
    when (null $ scriptName)
         (helpAndExit "scriptName is mandatory" ca)
    putStrLn scriptName

这只是部分解决方案,因为参数特定的帮助丢失。使用--help

$ stack run -- --help
The fooargs program

fooargs [OPTIONS]

Common flags:
  -s --script=SCRIPT  Script
  -t --thing=ITEM     Thing
  -? --help           Display help message
  -V --version        Print version information

不传递必需参数时:

scriptName is mandatory

fooargs [OPTIONS]

Common flags:
  -s --script=ITEM
  -t --thing=ITEM
  -? --help         Display help message
  -V --version      Print version information

--script--thing的帮助信息丢失的原因可能是CmdArgs.cmdArgsPrivate未初始化,这也会导致编译器警告。或者可能与doco中的此警告有关
使用注解创建的值不是纯值-第一次计算时,它们将包含注解,但随后将不包含注解。
发布一个部分答案是一种耻辱,我用另一种方法解决了我的问题,但由于这个问题已经几年没有答案了,也许其他人可以改进这个问题。

相关问题