F# 我们可以在同一个文件中扩展一个模块吗
为了与c#进行互操作,我执行以下操作F# 我们可以在同一个文件中扩展一个模块吗,f#,F#,为了与c#进行互操作,我执行以下操作 namespace foo type a = ... module myhelper = let d = ... open myhelper type b = ... module myhelper = // module name duplication error ... 我想添加更多可以使用类型b的函数,所以我必须在类型b声明之后编写它们,但我不想每次都创建一个新模块,我应该怎么做 全局模块可能会有所帮助,但我不希望我的c代
namespace foo
type a = ...
module myhelper =
let d = ...
open myhelper
type b = ...
module myhelper = // module name duplication error
...
我想添加更多可以使用类型b的函数,所以我必须在类型b声明之后编写它们,但我不想每次都创建一个新模块,我应该怎么做
全局模块可能会有所帮助,但我不希望我的c代码使用mymodule.a访问我的类型。所以我没有使用全局模块,而是使用全局名称空间
有没有更好的结构思想。这种微妙的相互依赖性往往会使您的库在增长时变得难以处理。F#有助于防止这种情况,或者至少迫使它明确 根据您的简化示例,您可以定义一个接口(该接口是
myhelper
目标和b
实现)或使用相互递归的类型:
键入MyHelper=
静态成员M1()=()
b.M4()中的静态成员M2()=设b=b()
及B()=
成员x.M3()=MyHelper.M1()
成员x.M4()=()
为什么不在模块myhelper
之前或内部声明类型b
?如果您需要使用一些模块函数来定义类型b
,则始终可以先声明类型b
,然后通过类型扩展type b和对其进行扩展。@pad但是,类型b的扩展方法无法访问先前定义的类型b的局部变量(let或默认参数)