F#库结构

F#库结构,f#,structure,lib,F#,Structure,Lib,我正在对我的一个项目进行重组,并决定为其中很大一部分做一个单独的图书馆项目 我的问题在于,我有多个带有模块的文件,其中许多应该对用户API隐藏,我如何实现这一点?我以前没有尝试过这一点,因此不熟悉库结构与命令行项目之间的区别,以及如何正确地确定范围。如果我能从中看到lib项目中的每个文件 其他项目为什么我们有Library.fs文件 正式一点。假设我有一些code.fs和Library.fs SomeCode.fs Library.fs 这是为了针对其他F#项目。如何构造它,使API只能看到正确

我正在对我的一个项目进行重组,并决定为其中很大一部分做一个单独的图书馆项目

我的问题在于,我有多个带有模块的文件,其中许多应该对用户API隐藏,我如何实现这一点?我以前没有尝试过这一点,因此不熟悉库结构与命令行项目之间的区别,以及如何正确地确定范围。如果我能从中看到lib项目中的每个文件 其他项目为什么我们有Library.fs文件

正式一点。假设我有一些code.fs和Library.fs

SomeCode.fs Library.fs
这是为了针对其他F#项目。如何构造它,使API只能看到正确的东西,并且仍然是可维护的?

internal
是您的朋友。如果您声明一个模块

module internal MyNamSpace.MySecretModule
这只能从项目内部访问

模块
是公共的,这是您的API

internal
也可用于单个函数,以防只隐藏某些函数

隐藏模块一部分的一种相当常见的方法也是采用以下模式

module MyModule =

    [<AutoOpen>]
    module internal MySecretModule =
        let apa = 1
        // Bunch of other internal stuff

    // Can use stuff from MySecretModule, but other projects cannot
    let bepa = apa + 1
模块MyModule=
[]
模块内部MySecretModule=
设apa=1
//一堆其他内部的东西
//可以使用MySecretModule中的内容,但其他项目不能
设bepa=apa+1

但是,如果模块中有不应隐藏的部分,该怎么办?请参阅扩展答案自从我询问后,它已被更改。但谢谢你,这帮了大忙。我正在将我的lexer/parser解释器与编译器分离,代码中的许多内容不应该在特定部分之外使用
module internal MyNamSpace.MySecretModule
module MyModule =

    [<AutoOpen>]
    module internal MySecretModule =
        let apa = 1
        // Bunch of other internal stuff

    // Can use stuff from MySecretModule, but other projects cannot
    let bepa = apa + 1