2012-05-13 24 views
6

私はF#を学んでいますが、私はうまく動作していますが、私は完全に理解していないことを書いています。ここでは方法のgetCredentials、家庭、言及、メッセージ、ShowHelp関数は、たとえばF#複数のステートメントによるラムダ式

let processArgs args = 
    match args with 
    | null 
    | [||]   -> [fun() -> getCredentials(); home 20; mentions 20; messages 20] 
    | [|"-h"|] 
    | [|"-?"|]  -> [showHelp] 
    | [|"-reset"|] -> [clearAllSettings] 
    | _    -> [fun() -> printfn "%s" (String.Join(" ", args))] 

[<EntryPoint>] 
    let main (args:string[]) = 
    try 
     let actions = processArgs args 
     List.iter (fun action -> action()) actions 
     0 
    finally 
     Console.ResetColor() 
     Console.CursorVisible <- true 

だ、とclearAllSettingsは、すべての単純な関数であり、あなたが期待するものを行います。 (?はい、それはTwitterクライアントだ、新しい 'Hello Worldの' デモということではありません)

ライン:私が望むよう

[fun() -> getCredentials(); home 20; mentions 20; messages 20] 

が働きます。それはgetCredentialsを呼び出し、次にhomeを呼び出して、次にメッセージを返します。

私の見解では、セミコロンは文の区切り文字のように動作しています。私は以前これを説明していない。それはここで何が起こっているのですか?

これを書くためにもっと慣れ親しんでいる方法がありますか(言い換えれば、熟練したF#プログラマーがフロアに座って、これを見て笑ったでしょうか?

詳細情報:私の元の目的は、アクションのリストを作成してから、オプションを発見するときにアクションを追加することでした。 C#で私は通常、リスト<アクション>()でこれを行います。セミコロンのことは、もともと私はそれを書こうとしたので驚いた:

[getCredentials; home 20; mentions 20; messages 20] 

しかし、コンパイラはそれを好まなかった。

+1

まあ、周りの言語仕様を掘るの数時間は、答えを明らかにする。それは、冗長な構文と呼ばれる構文の形式です。ここにそれを説明するリンクがあります:http://msdn.microsoft.com/en-us/library/dd233199.aspx私は、コマンドライン引数を解析する私のアプローチがF# 'ersのやり方であるかどうかは疑問です。 –

答えて

3

あなたが書いた:

[fun() -> getCredentials(); home 20; mentions 20; messages 20] 

コンパイラはタイプunit -> unitの関数であるだけで一つの要素を持つリストを作成します。 S1 ; S2は、S1の型がunitの場合のシーケンス構成であり、S1とS2が順番に実行され、S2の結果が返されます。したがって、3つの関数home,mentions、およびmessagesは実際にはint -> unitの署名を持っています。

あなたは4つの異なる機能のリストを作成したい場合は、それは次のようになります。

[ getCredentials; // ; is optional 
    fun() -> home 20; 
    fun() -> mentions 20; 
    fun() -> messages 20 ] 

これらの機能を使用しての混乱を避けるために、空白で区切られます。リストの区切り文字とシーケンスの構成として使用します。

あなたの例では、一つだけの要素を持つすべてのリストを持っているので、それは多くのことを簡単にすることができます。

let processArgs = function 
    | [||]   -> getCredentials(); home 20; mentions 20; messages 20 
    | [|"-h"|] 
    | [|"-?"|]  -> showHelp() 
    | [|"-reset"|] -> clearAllSettings() 
    | args   -> printfn "%s" (String.Join(" ", args)) 

[<EntryPoint>] 
let main (args:string[]) = 
    try 
    processArgs args 
    0 
    finally 
    Console.ResetColor() 
    Console.CursorVisible <- true 
+0

あなたは正しいです。私のC#イディオムは途方もなく続く。ありがとう。 –

+0

ちょっとした修正、| _ - > ... | args - > ... – Bernadette

+0

ありがとう@Bernadette、それは修正されました。 – pad