匹配命令行参数

13

我开始学习F#。想制作一个简单的程序,只告诉我它在命令行参数中找到了什么。我有:

[<EntryPoint>]
let main argv = 
    printfn "%A" argv
    match argv with
    | []  -> 42
    | _ -> 43

但是这会引发错误。如果我悬停在argv上,我会看到:

val argv:string []

这是我所期望的(字符串列表)。然而,第一个匹配表达式有一个错误:

Error 1 This expression was expected to have type string [] but here has type 'a list

基本上,我只想匹配空参数列表(空字符串列表)。正确的方式是什么?

我应该补充说明:我不仅想要一个解决方案(虽然那也不错)。我还想了解编译器在这里寻找什么,而我没有提供给它。

2个回答

18
< p >虽然[]字面意义上表示空列表,但类型string []是一个字符串数组而不是列表,这可能会让人感到困惑。

您可以像这样对数组进行模式匹配:

[<EntryPoint>]
let main argv = 
    printfn "%A" argv
    match argv with
    | [||]  -> 42
    | _ -> 43

像F#中许多看似矛盾的事情一样,这是由于其双重遗产的结果。

在OCaml中,您会使用int listint array类型,分别使用[1;2;3][|1;2;3|]值。但在C#/.NET中,方括号如int[]表示您正在处理数组。

为了让.NET用户更容易上手,F#在类型名称中使用[]作为array的别名,因此两种形式都可用。这与空列表文字恰好重合,这有些不幸,但保持原样也是另一个限制- F#设计的早期目标之一是使其与OCaml代码兼容,以便从该语言移植到F#尽可能少摩擦。


是的!那很令人困惑!似乎也不一致,但谢谢!你的解决方案有效。 - user1443098
3
@user1443098不要忘记标记答案(只需点击绿色勾号);) - FoggyFinder
@user1443098:同意。从某种意义上说,它是一致的,但可能不是你期望的那样。我已经在答案中添加了更多背景信息。 - scrwtp
@scrwtp,你能解释一下 [||] 的意思以及它为什么有效吗? - supertopi
2
@supertopi:这是空数组字面量,就像[]是一个空列表一样。这是你写一个零元素数组的方式,只留下开头和结尾的方括号。 - scrwtp

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接