2012-10-19 4 views
22

Quelle est la doctrine recommandée pour l'utilisation de l'attribut Autoopen?attribut Autoopen en F #

(Cette question est est probablement dans le prolongement de when to use module function VS static function on similarly named type)

Expert F # stipule que « Cela peut être utile lorsque vous définissez ad hoc des opérateurs de haut niveau et fonctions: »

Donc, ce semble être ici pour diminuer le rôle du module dans l'organisation du code, quand techniquement vous en avez besoin pour écrire le code mais vous supprimez son existence du point de vue du client.

Y at-il autre chose? Quand est-ce que vous l'utilisez?

Répondre

30

Je pense que l'utilisation principale pour l'attribut AutoOpen est quand vous voulez rendre certaines valeurs let-bound disponibles lorsque l'utilisateur de votre bibliothèque ouvre un espace de noms. C'est là que l'attribut est très utile, car je pense que les bibliothèques devraient généralement exporter toutes les définitions dans namespaces, mais pour certaines raisons, vous devez exporter valeurs et les valeurs ne peuvent pas être définies dans un espace de noms.

Voici un exemple de F# async extensions qui définit un constructeur de calcul et donc il a besoin d'exporter asyncSeq valeur (mais en même temps, toutes les fonctionnalités est enveloppé dans un espace de noms):

namespace FSharp.Async 

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

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

L'utilisateur du bibliothèque peut simplement écrire open FSharp.Async et ils verront asyncSeq. Je pense que le même modèle est utilisé avec différentes bibliothèques mathématiques (où vous voulez également exporter des fonctions simples nommées.)

Pour les modules (par exemple List et Seq), je pense que la plupart des gens ne pas utiliser open et accéder aux fonctionne via un nom de module (tel que List.map), donc bien que vous puissiez l'utiliser pour des modules imbriqués, je n'ai pas vu cela aussi souvent.

+0

Votre utilisation de valeurs montre clairement comment l'utiliser. thks – nicolas

16

Il peut être utilisé pour organiser un module en sous-modules mais présentent un point de vue-module unique unifié/externe:

module Outer = 

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

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

open Outer 

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

FParsec fait ceci: open FParsec ouvre tous les sous-modules (Primitives, CharParsers, etc. .).

+1

qui est intéressant – nicolas