Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell optpass应用回溯_Haskell_Command Line Arguments_Applicative_Optparse Applicative - Fatal编程技术网

Haskell optpass应用回溯

Haskell optpass应用回溯,haskell,command-line-arguments,applicative,optparse-applicative,Haskell,Command Line Arguments,Applicative,Optparse Applicative,我试图在一个程序中使用这个库,这个程序应该根据参数的数量执行不同的操作 例如,用于计算周长的程序的参数解析: module TestOpts where import Options.Applicative type Length = Double data PerimeterCommand = GeneralQuadranglePerimeter Length Length Length Length | RectanglePerimeter Length Length

我试图在一个程序中使用这个库,这个程序应该根据参数的数量执行不同的操作

例如,用于计算周长的程序的参数解析:

module TestOpts where

import Options.Applicative

type Length = Double

data PerimeterCommand
    = GeneralQuadranglePerimeter Length Length Length Length
    | RectanglePerimeter Length Length

parsePerimeterCommand :: Parser PerimeterCommand
parsePerimeterCommand = parseQuadPerimeter <|> parseRectPerimeter

parseQuadPerimeter = GeneralQuadranglePerimeter <$>
                     parseLength "SIDE1" <*>
                     parseLength "SIDE2" <*>
                     parseLength "SIDE3" <*>
                     parseLength "SIDE4"

parseRectPerimeter = RectanglePerimeter <$>
                     parseLength "WIDTH" <*> parseLength "HEIGHT"

parseLength name = argument auto (metavar name)
moduletestopts其中
导入选项。应用程序
类型长度=双
数据周界命令
=一般四边形周长
|矩形周长
parsePerimeterCommand::Parser PerimeterCommand
parsePerimeterCommand=ParseQuadPermiture ParseRectPermiture
ParseQuadPermiture=一般四边形周长
解析长度“SIDE1”
解析长度“SIDE2”
解析长度“SIDE3”
解析长度“SIDE4”
ParseRectPermission=矩形周长
parseLength“宽度”parseLength“高度”
parseLength名称=参数自动(metavar名称)
只有
的第一个参数才能成功解析。我认为需要某种类型的参数回溯,类似于Parsec的
try
combinator

当第一个备选方案可能会使用下一个备选方案的一些参数时,您对如何解析备选参数集有何想法?

请注意:此答案由OptPass应用程序作者Paolo Capriotti撰写

您不能直接使用optparse应用程序执行此操作。主要特点 optparse应用程序的一个特点是,可以按任何顺序解析选项。如果 如果希望主要使用参数(位置参数),则 最好有两个级别的解析器:在 optpass applicative,然后将生成的数组传递给普通解析器 (比如说使用Parsec)。如果只有位置参数,则 optparse应用程序不会给您带来太多好处,您只需解析
使用Parsec手动执行参数。

查看runParser的实现表明它无法回溯,但我不是100%确定。你能用命令子解析器重新设计你的程序参数吗?谢谢你的主意。它可以用于形状周长计算程序。但在我的实际应用程序中,单独的命令子解析器不适合。