开始学习F#。想要创建一个简单的程序,它只是告诉我它在命令行args中找到了什么。我有:
inner
但这会产生错误。如果我将鼠标悬停在argv上,我会看到:
val argv:string []
这是我所期望的(字符串列表)。但是,第一个匹配表达式有一个错误:
错误1此表达式应具有类型 string []但这里有类型 '列表
基本上我只想匹配一个空参数列表(一个空字符串列表)。什么是正确的方法?
我应该补充一点:我不想要一个解决方案(虽然那会很好)。我也想了解编译器在这里寻找的东西,我没有给它。
答案 0 :(得分:18)
由于[]
字面值用于表示空列表,因此可能会造成混淆,但类型string []
是字符串数组而不是列表。
你可以对这样的数组进行模式匹配:
[<EntryPoint>]
let main argv =
printfn "%A" argv
match argv with
| [||] -> 42
| _ -> 43
与F#中许多看似不一致的东西一样,这是其双重传承的结果。
在OCaml中,您分别使用int list
和int array
作为值,[1;2;3]
和[|1;2;3|]
。但是在C#/ .NET中,int[]
中的方括号表示你正在处理数组。
可能为了试图让.NET群体更加平易近人,在类型名称中,F#使用[]
作为array
的别名,因此两种形式都可用。令人遗憾的是,这与空列表文字重合,但保留“原样”是另一个约束--F#设计的早期目标之一是使其与OCaml代码兼容,因此从该语言移植到F#就像摩擦一样尽可能无。