F#でargparseぽいことをする方法

F#でコマンドライン引数をうまく使いたかったので。

let ParseArguments options argv = 
    let key = ref "" in
    argv 
    |> Seq.groupBy( fun s -> 
        match Seq.exists(fun t -> String.Compare(t, s) = 0) options with
        | true -> key := s; !key
        | false -> !key
    )
    |> Seq.map(fun (e1, e2) -> 
        let new_e2 = e2 |> Seq.skip 1 |> Seq.toList in
        (e1, new_e2))
    |> dict 

optionsはオプション。argvは与えられたコマンドライン引数。戻り値は辞書型。

使い方

[<EntryPoint>]
let main argv =
    let options = ["-a"; "-b"] in 
    let args = ParseArguments options argv in
    printfn "%A" args.["-a"].[0]