para imagen emplea atributo f# code-organization

f# - emplea - atributo title de la imagen



Atributo AutoOpen en F# (2)

¿Cuál es la doctrina recomendada para usar el atributo AutoOpen?

(Probablemente, esta pregunta es una continuación de cuándo usar la función estática VS del módulo de función en un tipo similar )

Expert F # indica que "Esto puede ser útil cuando está definiendo operadores y funciones de alto nivel ad hoc:"

Entonces, parece que esto está aquí para disminuir la función del módulo en la organización del código, cuando técnicamente se necesita uno para escribir el código pero se elimina su existencia desde la perspectiva del cliente.

¿Hay algo más? Cuando lo usas ?


Puede utilizarse para organizar un módulo en submódulos pero presentar una vista unificada / de un solo módulo de forma externa:

module Outer = [<AutoOpen>] module Inner1 = let f1() = () [<AutoOpen>] module Inner2 = let f2() = () open Outer let x = f1() let y = f2()

FParsec hace esto: open FParsec abre todos los submódulos ( Primitives , CharParsers , etc.).


Creo que el uso principal del atributo AutoOpen es cuando desea que algunos valores de límite de límite estén disponibles cuando el usuario de su biblioteca abra un espacio de nombres. Aquí es donde el atributo es muy útil, porque creo que las bibliotecas generalmente deberían exportar todas las definiciones en los espacios de nombres , pero para algunos fines, es necesario exportar valores y los valores no se pueden definir dentro de un espacio de nombres.

Aquí hay un ejemplo de F # async extensions que define un generador de cómputo y, por lo tanto, necesita exportar el valor asyncSeq (pero al mismo tiempo, todas las funciones están envueltas en un espacio de nombres):

namespace FSharp.Async type AsyncSeq<''T> = (* ... *) type AsyncSeqBuilder() = (* ... *) [<AutoOpen>] module GlobalValues = let asyncSeq = AsyncSeqBuilder()

El usuario de la biblioteca solo puede escribir open FSharp.Async y verá asyncSeq . Creo que el mismo patrón se usa con varias bibliotecas matemáticas (donde también desea exportar funciones de nombre simple).

Para los módulos (por ejemplo, List y Seq ), creo que la mayoría de la gente no usa open y accede a las funciones a través de un nombre de módulo (como List.map ), así que aunque puede usar esto para módulos anidados, no he visto eso. tan frecuentemente