Атрибут AutoOpen в F #

Какова рекомендуемая доктрина для использования атрибута AutoOpen?

(Этот вопрос, вероятно, является продолжениемкогда использовать модульную функцию VS статической функции для одноименного типа )

Эксперт F # заявляет, что «это может быть полезно, когда вы определяете специальные операторы и функции верхнего уровня:»

Так что, похоже, это как бы уменьшает роль модуля в организации кода, когда вам технически нужен один для написания кода, но вы удаляете его существование с точки зрения клиента.

Есть что-то еще? Когда вы используете это?

Ответы на вопрос(2)

но внешне представить унифицированное / одномодульное представление:

module Outer =

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

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

open Outer

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

FParsec Является ли это:open FParsec открывает все подмодули (Primitives, CharParsers, и т.д.).

 nicolas19 окт. 2012 г., 18:33
Это интересно
Решение Вопроса

AutoOpen Атрибут - это когда вы хотите сделать доступными некоторые значения, когда пользователь вашей библиотеки открывает пространство имен. Здесь атрибут очень полезен, потому что я думаю, что библиотеки должны экспортировать все определения вПространства имен, но для некоторых целей нужно экспортироватьценности и значения не могут быть определены внутри пространства имен.

Вот пример изF # асинхронные расширения который определяет построитель вычислений и, следовательно, он должен экспортироватьasyncSeq значение (но в то же время все функциональные возможности обернуты в пространство имен):

namespace FSharp.Async

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

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

Пользователь библиотеки может просто написатьopen FSharp.Async и они увидятasyncSeq, Я думаю, что один и тот же шаблон используется с различными математическими библиотеками (куда вы также хотите экспортировать функции с простыми именами.)

Для модулей (например,List а такжеSeqЯ думаю, что большинство людей не используютopen и получить доступ к функциям через имя модуля (например,List.map), поэтому, хотя вы можете использовать это для вложенных модулей, я не видел это так часто.

 nicolas19 окт. 2012 г., 18:37
Ваше использование ЗНАЧЕНИЙ дает понять, как его использовать. Thks

Ваш ответ на вопрос