Haskell 由标准库拾取的命令行选项

Haskell 由标准库拾取的命令行选项,haskell,criterion,Haskell,Criterion,我使用了库标准和cmdargs 当我完全不使用cmdargs编译程序并运行它(例如../prog--help)时,Criteria会对可能的选项和运行次数等做出一些不必要的响应 当我按照下面的方式编译和运行它时,命令行选项首先由我的代码获取,然后由标准读取。Criteria随后报告错误,告诉我选项--byte未知。在标准文档中,我没有看到任何关于如何关闭或解决此问题的内容。在我读过命令行选项后,有没有办法清除它们?否则,我需要使用CPUTime而不是criteria,这对我来说没关系,因为我确实

我使用了库标准和cmdargs

当我完全不使用cmdargs编译程序并运行它(例如../prog--help)时,Criteria会对可能的选项和运行次数等做出一些不必要的响应

当我按照下面的方式编译和运行它时,命令行选项首先由我的代码获取,然后由标准读取。Criteria随后报告错误,告诉我选项--byte未知。在标准文档中,我没有看到任何关于如何关闭或解决此问题的内容。在我读过命令行选项后,有没有办法清除它们?否则,我需要使用CPUTime而不是criteria,这对我来说没关系,因为我确实需要criteria提供的额外功能和数据

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveDataTypeable #-}

import System.Console.CmdArgs

data Strlen = Strlen {byte :: Int} deriving (Data, Typeable, Show)

strlen = cmdArgsMode $ Strlen {byte = def} &= summary "MessagePack benchmark v0.04"

main = do
  n <- cmdArgsRun strlen
  let datastring = take (byte n) $ randomRs ('a','z') (mkStdGen 3)
  putStrLn "Starting..."
  conn <- connect "192.168.35.62" 8081
  defaultMain [bench "sendReceive" $ whnfIO (mywl conn datastring)] 
{-#语言重载字符串}
{-#语言派生数据类型化}
导入System.Console.CmdArgs
数据Strlen=Strlen{byte::Int}派生(数据,可键入,显示)
strlen=cmdArgsMode$strlen{byte=def}&=摘要“MessagePack基准v0.04”
main=do

n使用
System.Environment.withArgs
。首先使用
cmdArgs
解析命令行参数,然后将未使用的内容传递给
标准

main = do
    (flags, remaining) <- parseArgsHowever
    act according to flags
    withArgs remaining $
        defaultMain [ ... ]
main=do

(旗帜,剩余)看一看。您应该能够使用
函数编写自己的
DefaultMain,该函数可以根据需要处理参数,包括忽略参数,或忽略未知参数,等等。

恐怕我不明白如何将此应用于我的代码段。@JFritsch好的,我刚刚查看了cmdargs文档,如果我理解正确的话,您必须为您的类型(
Strlen
)添加一个用于其他参数的字段,并使用
args
在那里收集它们。但是,我不确定cmdargs对未知选项做了什么,标准参数是什么。如果您希望Criteria只使用默认设置,
withArgs[]$defaultMain…
非常简单且有效。如果您想将固定参数传递给Criteria,
withArgs[“-s”,“200”]
例如,如果我导入System.Environment(withArgs),当然可以工作。我想知道是否有什么更优雅的东西可以保持生成的二进制文件的精简。