F#noob:匹配命令行args

use*_*098 12 f# match argv

开始学习F#.想要创建一个简单的程序,它只是告诉我它在命令行args中找到了什么.我有:

[<EntryPoint>]
let main argv = 
    printfn "%A" argv
    match argv with
    | []  -> 42
    | _ -> 43
Run Code Online (Sandbox Code Playgroud)

但这会给出错误.如果我将鼠标悬停在argv上,我会看到:

val argv:string []

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

错误1此表达式应具有类型字符串[],但此处的类型为"列表"

基本上我只想匹配一个空参数列表(一个空字符串列表).这样做的正确方法是什么?

我应该补充一点:我不只是想要一个解决方案(虽然那会很好).我也想了解编译器在这里寻找的东西,我没有给它.

scr*_*wtp 18

它可能会令人困惑,因为[]literal用于表示空列表,但type string []是字符串数组而不是列表.

你可以对这样的数组进行模式匹配:

[<EntryPoint>]
let main argv = 
    printfn "%A" argv
    match argv with
    | [||]  -> 42
    | _ -> 43
Run Code Online (Sandbox Code Playgroud)

就像F#中许多看似不一致的东西一样,这是其双重传统的结果.

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

可能为了试图让.NET人群更加平易近人,在类型名称中F#[]用作别名array,因此两种形式都可用.令人遗憾的是,这与空列表文字重合,但保留"原样"是另一个约束--F#设计的早期目标之一是使其与OCaml代码兼容,因此从该语言移植到F#就像摩擦一样尽可能无.

  • @ user1443098不要忘记标记答案(只需点击绿色勾选);) (3认同)
  • @supertopi:这是空数组文字,就像`[]`是一个空列表一样.这就是你如何写一个零元素的数组,只剩下开始和结束括号. (2认同)