2017-03-01 85 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