Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 我们可以在同一个文件中扩展一个模块吗_F# - Fatal编程技术网

F# 我们可以在同一个文件中扩展一个模块吗

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代

为了与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或默认参数)