2017-03-01 66 views
11

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

[<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

基本上我只是想匹配空参数列表(字符串列表为空)。什么是正确的方式来做到这一点?

我要补充:我不只是要一个解决方案(虽然这将是很好)。我也想了解编译器在这里寻找什么,我没有给它。

回答

17

它可能会令人困惑,因为[]文字用于表示一个空列表,但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#移植是摩擦尽可能没有。

+0

是的!这是令人困惑的!似乎也不一致,但谢谢!您的解决方案的工作 – user1443098

+3

@ user1443098不要忘记,以纪念答案(只需点击绿色的勾);) –

+0

@ user1443098:同意。从某种意义上说它是一致的,但可能并不是你期望的那样。我为答案增加了更多背景。 – scrwtp