开始学习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 list和int array用于类型[1;2;3]和[|1;2;3|]值.但是在C#/ .NET中,方括号int[]表示你正在处理数组.
可能为了试图让.NET人群更加平易近人,在类型名称中F#[]用作别名array,因此两种形式都可用.令人遗憾的是,这与空列表文字重合,但保留"原样"是另一个约束--F#设计的早期目标之一是使其与OCaml代码兼容,因此从该语言移植到F#就像摩擦一样尽可能无.