Haskell中如何用Option.Applicative实现固定命令行选项?
解决方案
核心思路
既然strOption/strArgument只能处理字符串输入,你可以在获取到参数值后,手动将字符串映射到自定义枚举类型,同时处理默认值和无效输入的情况。
代码示例(以Scala CLI为例)
首先定义你的枚举类型:
sealed trait DataType case object File extends DataType case object Env extends DataType case object Db extends DataType
然后处理命令行参数,完成字符串到枚举的映射:
import scala.cli._ object CliApp extends App { // 定义--display选项,默认值为"file" val displayOpt = strOption( name = "display", default = Some("file"), help = "指定数据类型:file/env/db,默认使用file" ) // 解析命令行参数 val parsedArgs = CliApp.parse(args) val inputStr = parsedArgs(displayOpt) // 字符串转枚举,无效输入默认返回File val dataType: DataType = inputStr.toLowerCase match { case "file" => File case "env" => Env case "db" => Db case _ => File } // 后续业务逻辑使用dataType println(s"选中的数据类型:$dataType") }
代码示例(以Python Click为例)
如果用Python的Click库,可以直接利用其枚举支持特性:
from enum import Enum import click class DataType(Enum): File = "file" Env = "env" Db = "db" @click.command() @click.option( '--display', type=click.Choice([dt.value for dt in DataType]), default='file', help='指定数据类型:file/env/db,默认使用file' ) def run(display): # 直接将字符串参数转为枚举实例 data_type = DataType(display) print(f"选中的数据类型:{data_type}") if __name__ == '__main__': run()
关键说明
- 手动匹配方式通用性强,适配所有CLI库,同时能灵活处理大小写不敏感、自定义无效输入逻辑等场景
- 部分CLI库(如Python Click)内置了枚举参数支持,可以直接限定输入范围并自动完成映射,减少手动代码量
内容的提问来源于stack exchange,提问作者Taimoor Zaeem
相关产品推荐
相关产品推荐

