代码之家  ›  专栏  ›  技术社区  ›  Franco Tiveron

在同一文件的多个部分中拆分F模块

f#
  •  4
  • Franco Tiveron  · 技术社区  · 7 年前

    我有以下工作的F源文件

    namespace Namspa1
    
    [<AutoOpen>]
    module M1 = 
        let [<Literal>] constant1 = "Hello, "
    
    type Greeter(name) = 
        member x.Greet() = sprintf "%s%s" constant1 name
    
    module M2 =
        let greet name = Greeter(name).Greet()
    

    这是可行的,但我想要的是在定义Constant1的同一模块M1中定义函数greet。 换句话说,只使用一个我想获取的文件

    Namspa1.M1.constant1
    Namspa1.Greeter
    Namspa1.M1.greet //not Namspa1.M2.greet
    
    • 常量1是一个值,因此必须在模块内
    • greater使用constant1,所以必须在文件的后面;我希望它在名称空间中,而不是在模块中,所以它是不缩进的
    • 最后,greet是一个函数,所以它必须在一个模块中,我想使用相同的模块m1。它还使用了问候语,因此它必须位于类型定义之后。

    如果我尝试将问候语函数定义更改为

    module M1 =
        let greet name = Greeter(name).Greet()
    

    我得到一个M1的重复定义错误。

    我该怎么做?

    编辑

    有人建议使用属性compilationrepresentation(compilationrepresentationflags.modulesuffix)修复重复定义错误,这是正确的,因此感谢您的帮助。

    但是我的请求是关于扩展M1。我希望能够像在m1中定义函数一样使用m1.greet。 例如,如果我尝试在外部使用定义(例如另一个源文件),我可以使用m2.greet,所以我想使用m1.greet,这对于属性来说是不可能的。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Thomas Corbière    7 年前

    你想要达到的目标可以通过使用 recursive namespace .注意 rec 声明命名空间时使用关键字。

    namespace rec Namspa1
    
    [<AutoOpen>]
    module M1 =
        let [<Literal>] constant1 = "Hello, "
        let greet name = Greeter(name).Greet()
    
    type Greeter(name) =
        member x.Greet() = sprintf "%s%s" constant1 name
    
        2
  •  3
  •   cadull    7 年前

    这可以通过设置 CompilationRepresentation 属性 CompilationRepresentationFlags.ModuleSuffix .扩展这样的模块不是预期的用例,因此第二个模块定义需要移动到单独的源文件中。

    第一个文件:

    namespace Namspa1
    
    [<AutoOpen>]
    module M1 = 
        let [<Literal>] constant1 = "Hello, "
    
    type Greeter(name) = 
        member x.Greet() = sprintf "%s%s" constant1 name
    

    第二个文件:

    namespace Namspa1
    
    [<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
    module M1 =
        let greet name = Greeter(name).Greet()
    

    从技术上讲,它生成一个名为m1module的模块,这将影响从其他.NET语言访问。