匹配F#中的数组

时间:2016-02-23 02:57:21

标签: f#

我想在命令行参数数组上进行模式匹配。

我想要的是一个案例,它匹配任何至少有一个或多个参数的情况,并将第一个参数放在一个变量中,然后让另一个案例在没有参数的情况下处理。

match argv with
    | [| first |] -> // this only matches when there is one
    | [| first, _ |] -> // this only matches when there is two
    | [| first, tail |] -> // not working
    | argv.[first..] -> // this doesn't compile
    | [| first; .. |] -> // this neither
    | _ -> // the other cases

4 个答案:

答案 0 :(得分:6)

你可以use truncate

match args |> Array.truncate 1 with
| [| x |] -> x
| _       -> "No arguments"

答案 1 :(得分:4)

在没有转换为列表的情况下,您最接近的是:

match argv with
| arr when argv.Length > 0 ->
    let first = arr.[0]
    printfn "%s" first
| _ -> printfn "none"

答案 2 :(得分:2)

如果您使用argvArray.toList转换为列表,则可以使用cons operator::将列表匹配为列表:

match argv |> Array.toList with
    | x::[]  -> printfn "%s" x
    | x::xs  -> printfn "%s, plus %i more" x (xs |> Seq.length)
    | _  -> printfn "nothing"

答案 3 :(得分:0)

如果您只想要第一项,我更喜欢Array.tryHead

match Array.tryHead items with
| Some head -> printfn "%O" head
| None -> printfn "%s" "No items"