2012-10-19 17 views
22

AutoOpen özniteliğini kullanmak için önerilen doktrin nedir?AutoOpen özniteliği F #

Yani bu:

(Bu soru muhtemelen when to use module function VS static function on similarly named type için devamında olandır)

Uzman F # "ad hoc üst düzey operatörleri ve işlevleri tanımlarken, bu yararlı olabilir" belirtiyor Kod organizasyonunda modül rolünü azaltmak, teknik kod yazmak için teknik desteğe ihtiyaç duyduğunuzda, ancak varlığını müşteri perspektifinden kaldırmanız için burada gibi görünüyor.

Başka bir şey var mı? Ne zaman kullanıyorsunuz?

O dıştan birleşik/tek modül görünümü alt modüllere bir modül organize ama sunmak için kullanılabilir

cevap

30

AutoOpen özniteliğinin ana kullanımı, kitaplığınızın kullanıcısı bir ad alanı açtığı zaman izin verilen bazı değerleri kullanmak istediğiniz zamandır. Özniteliğin çok kullanışlı olduğu yer burasıdır çünkü kütüphanelerin genel olarak tüm tanımları ad alanı olarak dışa aktarması gerektiğini düşünüyorum, ancak bazı amaçlar için değerleri dışa aktarmanız ve değerlerin bir ad alanı içinde tanımlanamaması gerekir. Burada

bir hesaplama kurucu tanımlar F# async extensions bir örneğidir ve bu nedenle (ancak aynı zamanda, tüm işlevselliği ad sarılır) asyncSeq değeri vermek için gereken:

namespace FSharp.Async 

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

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

kullanım Kütüphane open FSharp.Async yazabilir ve asyncSeq görecektir. Aynı desen çeşitli matematik kitaplıkları ile kullanılan düşünüyorum (ayrıca basit adlandırılmış işlevleri vermek istiyoruz.) Modülleri için

(örn List ve Seq), ben insanların çoğu open kullanmak ve erişmezseniz düşünüyorum Bir modül ismiyle fonksiyonlar (List.map gibi), bunu iç içe modüller için kullanabilmenize rağmen, bunu sık olarak görmedim.

+0

VALUES kullanımınız, onu nasıl kullanacağınızı açıkça belirtir. thks – nicolas

16

:

module Outer = 

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

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

open Outer 

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

FParsec yapar: open FParsec tüm alt modülleri açar (Primitives, CharParsers, vs .).

+1

Bu ilginç – nicolas