2017-03-01 16 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 []はリストではなく文字列の配列であるため、混乱する可能性があります。

あなたはこのような配列に対してパターン一致させることができます:F#で、多くの一見矛盾したものと同様

[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 
    match argv with 
    | [||] -> 42 
    | _ -> 43 

を、これはその二重の遺産の結果です。

OCamlでは、値としてそれぞれ[1;2;3][|1;2;3|]のタイプにはint listint arrayを使用します。しかし、C#/ .NETでは、int[]の角括弧は、配列を扱っていることを示す方法です。

おそらく、.NETの群衆の方に近づくように、F#はarrayのエイリアスとして[]を使用するため、両方のフォームを使用できます。これは空リストのリテラルと一致するのは残念ですが、そのままにしておくことはもう一つの制約でした.F#デザインの初期目標の1つはOCamlコードとの互換性を持たせることでした。そのため、その言語からF#への移植は摩擦可能な限り。

+0

はい!それは混乱している!矛盾しているようですが、ありがとう!あなたの解決策は動作します – user1443098

+3

@ user1443098回答に印を付けることを忘れないでください(ちょうど緑のダニにクリックしてください);) –

+0

@ user1443098:同意します。それはある意味では一貫していますが、おそらくそれが期待される場所ではありません。私は答えにいくつかの背景を追加しました。 – scrwtp