You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:16:12