gpt4 book ai didi

f# - 将 F# 模块拆分为同一文件中的多个部分

转载 作者:行者123 更新时间:2023-12-04 05:42:41 25 4
gpt4 key购买 nike

我有以下工作的 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
  • constant1 是一个值,所以必须在模块中
  • Greater 使用 constant1,因此必须在文件的后面;我希望它在命名空间中,而不是在模块中,因此它是非缩进的
  • 最后 greet 是一个函数,所以它必须在一个模块中,我想使用同一个模块 M1。它还使用 Greeter,因此它必须位于类型定义之后。

如果我尝试将 greet 函数定义更改为

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

我收到 M1 的重复定义错误。

我该怎么做?

编辑

有人建议使用属性 CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix) 修复重复定义错误,这是真的,谢谢。

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

最佳答案

使用 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

关于f# - 将 F# 模块拆分为同一文件中的多个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50959244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com