6

私は 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

メソッド getCredentials、home、mention、messages、showHelp、および clearAllSettings はすべて単純な関数であり、期待どおりに機能します。(はい、これは Twitter クライアントです。新しい 'Hello World' デモではありませんか?)

この線:

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

私が望むように動作します。getCredentials、ホーム、メンション、メッセージの順に呼び出します

私の観点からは、セミコロンはステートメント区切りのように機能しています。私はこれが以前に説明されているのを見たことがありません。それがここで起こっていることですか?

これをもっと慣用的な方法で書くことはできますか (つまり、経験豊富な F# プログラマーは、これを見たときに笑い転げるでしょうか)。

詳細情報: 私の当初の意図は、アクションのリストを作成し、オプションを見つけたらアクションを追加することでした。C# では通常、これを List< Action >() で行います。もともと私は次のように書こうとしたので、セミコロンのことは私を驚かせました:

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

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

4

1 に答える 1

3

あなたが書くとき:

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

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

4 つの異なる関数のリストを作成する場合は、次のようにする必要があります。

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

これらの関数は、使用時の混乱を避けるために空白で区切られています。リスト区切り文字およびシーケンス構成として。

あなたの例には、要素が 1 つしかないすべてのリストがあるため、大幅に簡略化できます。

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
于 2012-05-22T02:33:49.773 に答える