是否可以在 F# 中的单个语句中打开给定模块的所有子模块?

Can all submodules of a given module be opened in a single statement in F#?

我的应用程序中的某些部分有这样的东西:

open ModuleX
open ModuleX.Submodule1
open ModuleX.Submodule2
open ModuleX.Submodule3
open ModuleX.Submodule4
open ModuleX.Submodule5
open ModuleX.Submodule6

有什么简单的方法可以做到:

open ModuleX
open ModuleX.*

我的应用程序中最糟糕的情况是一个模块有 27 行模块打开语句。我可以将它分成不同的文件,但我只会将开口分成不同的文件,并没有真正解决任何问题。你会建议 "merge" 个子模块吗?自动打开不适合我的情况。

或者这只是任何使用 F# 的人都必须处理的事情吗?

没有办法在打开的时候控制这个,但是你可以让这些模块"automatically openable"在它们的声明点。为此,用 [<AutoOpen>]:

装饰它们
module A =

  [<AutoOpen>]
  module B =
    let x = 5

  module C =
    let y = 6

open A

let z = x   // x is now available
let u = C.y // y still requires qualified access

购买 [<AutoOpen>] 的人也喜欢 [<RequireQualifiedAccess>] :-)

[<RequireQualifiedAccess>]
module C =
  let y = 6

open C // Compiler error