F#noob:匹配命令行args

时间:2017-03-01 21:11:47

标签: f# match argv

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

inner

但这会产生错误。如果我将鼠标悬停在argv上,我会看到:

  

val argv:string []

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

  

错误1此表达式应具有类型       string []但这里有类型       '列表

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

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

1 个答案:

答案 0 :(得分:18)

由于[]字面值用于表示空列表,因此可能会造成混淆,但类型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#就像摩擦一样尽可能无。