2012-10-19 76 views
22

建議使用AutoOpen屬性的原則是什麼?F#中的AutoOpen屬性

(這個問題可能是在延續when to use module function VS static function on similarly named type

專家F#指出:「當你定義特設頂級運營商 和功能,這是有用的:」

所以這似乎在這裏會減少代碼組織中的模塊角色,當你從技術上需要一個編寫代碼,但是從客戶端角度去除它的存在時。

還有別的嗎? 你什麼時候使用它?

回答

30

我認爲AutoOpen屬性的主要用途是當您的庫的用戶打開一個名稱空間時,您想讓某些允許綁定的值可用。這是屬性非常有用的地方,因爲我認爲庫通常應該導出命名空間中的所有定義,但出於某些目的,您需要導出,並且值不能在命名空間內定義。

這裏是從F# async extensions的示例,其限定了計算助洗劑,因此它需要導出asyncSeq值(但在同一時間,所有的功能被包裹在一個命名空間):

namespace FSharp.Async 

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

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

的用戶圖書館可以只寫open FSharp.Async,他們會看到asyncSeq。我認爲同樣的模式被用於各種數學庫(您也想導出簡單命名函數。)

對於模塊(例如ListSeq),我想大多數人不使用open和訪問通過模塊名稱(例如List.map)來實現功能,所以儘管您可以將它用於嵌套模塊,但我還沒有經常看到。

+0

您使用VALUES清楚地告訴您如何使用它。 THKS – nicolas

16

它可用於組織模塊成子模塊,但呈現在外部統一/單模塊視圖:

module Outer = 

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

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

open Outer 

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

FParsec執行此:open FParsec打開所有的子模塊(PrimitivesCharParsers等)。

+1

這很有趣 – nicolas