1

次の ML の抜粋 ( Effective ML talkから取得) では、値バインディング式内にモジュールの省略形があります。F# で同等のことを行うことは可能ですか? モジュールの省略形を使用できることは知っていますが、このように「インライン」で使用できるかどうかに特に興味があります。

let command =
  let default_config = { exit_code = 0; message = None } in
  let flags = 
    let module F = Command.Flag in
    [ F.int    "-r" (fun cfg v -> { cfg with exit_code = v });
      F.string "-m" (fun cfg v -> { cfg with message   = v });
    ]
  ...
4

1 に答える 1

1

いいえ、この機能は F# では使用できません。次を使用して、トップレベルのモジュールの省略形のみを実行できます(あなたが言うように):

module F = Command.Flag

これらはソースファイルの途中に書くことができますが、最上位にある必要があり、スコープは常にファイルの終わりまで (または非表示の別の定義までF) になります。おそらく、これを使用してから別の定義hidden Fを使用すると、同様の効果が得られるでしょう。例えば:

module L = List
[0 .. 9] |> L.map ((*) 2) // Uses functional `List.map`

module L = Seq    
[0 .. 9] |> L.map ((*) 2) // Uses lazy `Seq.map`

これは多くの場合に役立つ機能であることに同意します。一方で、F# プログラミング スタイルは ML とはかなり異なるため、Effective ML トークからのアドバイスは F# プログラミングに直接対応しない場合があります。何かをローカル定義にする必要がある場合、最適なオプションはそれを F# オブジェクトとして定義することです。

于 2012-09-30T22:03:26.993 に答える