Question Attribut AutoOpen dans F #


Quelle est la doctrine recommandée pour utiliser l'attribut AutoOpen?

(Cette question est probablement dans le prolongement de quand utiliser la fonction de module VS fonction statique sur le même nom nommé )

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

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

Y a-t-il autre chose? Quand l'utilisez vous?


23
2017-10-19 15:23


origine


Réponses:


Je pense que l'utilisation principale de la AutoOpen attribut est lorsque 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 espaces de noms, mais à certaines fins, vous devez exporter valeurs et les valeurs ne peuvent pas être définies dans un espace de nom.

Voici un exemple de Extensions asynchrones F # qui définit un générateur de calcul et doit donc exporter asyncSeq value (mais en même temps, toutes les fonctionnalités sont regroupées dans un espace de noms):

namespace FSharp.Async

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

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

L’utilisateur de la bibliothèque peut simplement écrire open FSharp.Async et ils verront asyncSeq. Je pense que le même modèle est utilisé avec diverses bibliothèques mathématiques (où vous souhaitez également exporter des fonctions simples).

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


31
2017-10-19 15:55



Il peut être utilisé pour organiser un module en sous-modules mais présenter une vue unifiée / mono-module en externe:

module Outer =

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

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

open Outer

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

FParsec est ce que ca: open FParsec ouvre tous les sous-modules (Primitives, CharParsers, etc.).


16
2017-10-19 15:43