作为公认的答案中提到的“ARGS”参数的入口点是一个数组,而不是一个列表,所以你不能用它列表匹配的语法。
如上所示,您可以将参数转换为实际列表并将其用于匹配,而不是在数组上进行匹配。我发现这是一种非常有用的方式来处理命令行参数(尽管它可能对您的示例情况有些过分)。举个例子:
[<EntryPoint>]
let main args =
let arglist = args |> List.ofSeq
match arglist with
| first :: [] ->
// do something with 'first'
| _ -> // catches both the no-argument and multi-argument cases
printfn "Usage : "
// print usage message
编辑: 对于更为复杂的情况有两种方法从这里走。您当然可以在匹配中添加更复杂的情况,或者您可以用递归方式解析参数列表以构建表示选项和参数的对象。后者会有点复杂,不适合这里,但作为一些更复杂的匹配情况的例子,下面是一些代码,涉及一些最近的工作,其中可执行文件接受用于操作目标文件的“命令”,并且每个命令有不同的进一步的参数(每个命令调用其实现我离开了为简洁起见功能)
[<EntryPoint>]
let main args =
let arglist = args |> List.ofSeq
match arglist with
| target :: "list" :: [] ->
listContent target
| target :: "remove" :: name :: [] ->
removeContent target name
| target :: "add" :: name :: [] ->
addContent target name
| target :: "addall" :: names ->
for name in names do
addContent target name
| _ -> // catches cases not covered above
printfn "Usage : "
// print usage message
如果你想有一个第三方的lib,我喜欢用[UnionArgParser(https://github.com/eiriktsarpalis/UnionArgParser)为F#CMD行工具。 –