30

AutoOpen 属性を使用するための推奨教義は何ですか?

(この質問はおそらく、モジュール関数 VS 静的関数を同様の名前の型でいつ使用するかの続きです)

Expert F# は、「これは、アドホックなトップレベルの演算子と関数を定義するときに役立つ可能性がある」と述べています。

したがって、これは、コードを記述するために技術的にモジュールが必要であるが、クライアントの観点からその存在を削除する場合に、コード編成におけるモジュールの役割を縮小するためにここにあるようです。

他に何かありますか?いつ使うの?

4

3 に答える 3

44

この属性の主な用途はAutoOpen、ライブラリのユーザーが名前空間を開いたときに、いくつかの let バインドされた値を利用できるようにする場合だと思います。ライブラリは通常、名前空間内のすべての定義をエクスポートする必要があると思いますが、一部の目的ではをエクスポートする必要があり、値を名前空間内で定義することはできないため、これは属性が非常に役立つ場所です。

計算ビルダーを定義するF# 非同期拡張機能の例を次に示します。したがって、値をエクスポートする必要がありasyncSeqます (ただし、同時に、すべての機能は名前空間にラップされます)。

namespace FSharp.Async

type AsyncSeq<'T> = (* ... *)
type AsyncSeqBuilder() = (* ... *)

[<AutoOpen>]
module GlobalValues = 
  let asyncSeq = AsyncSeqBuilder()

ライブラリのユーザーは、書き込むだけopen FSharp.Asyncで が表示されますasyncSeq。さまざまな数学ライブラリで同じパターンが使用されていると思います(単純な名前の関数もエクスポートしたい場合)。

モジュール (例:Listおよび) の場合、ほとんどの人はモジュール名 ( など) を介して関数をSeq使用したりアクセスしたりしないと思います。したがって、これをネストされたモジュールに使用することはできますが、それほど頻繁には見たことがありません。openList.map

于 2012-10-19T15:55:49.680 に答える
23

モジュールをサブモジュールに編成するために使用できますが、外部に統合/単一モジュールビューを表示します。

module Outer =

  [<AutoOpen>]
  module Inner1 =
    let f1() = ()

  [<AutoOpen>]
  module Inner2 =
    let f2() = ()

open Outer

let x = f1()
let y = f2()

FParsecはこれを行います:open FParsecすべてのサブモジュール(、、など)を開きPrimitivesますCharParsers

于 2012-10-19T15:43:26.113 に答える