创建仅对F#项目可见的模块/类型

时间:2012-02-28 19:32:51

标签: f# inline

是否可以使模块或类型仅对F#项目可见?其他语言看不到活动模式,但我认为这是因为它们不是这些语言中的有效标识符。是否有其他方法可以实现模块/类型的相同效果?

4 个答案:

答案 0 :(得分:3)

这真糟糕吗?

[<AutoOpen>]
module ``(|Hidden|)`` = 
  module MyModule =
    let f() = ()

MyModule仅出现在F#中。

答案 1 :(得分:1)

我想我可能只是将F#特定的API放在F#模块中,并在模块上添加文档注释,以便将C#伙伴指向适当的命名空间/类型。

答案 2 :(得分:1)

我有类似的问题。在我的情况下,我在F#中实现了一些异步功能,我希望基本上使用相同的API,但为F#返回Async<T>,为C#5消费者返回Task<T>,为人们返回T谁不想处理异步。

我最终做的是创建三个子命名空间(Async,Sync和FSharp)并在所有三个命名空间中定义相同的接口,只有返回类型不同。

然后在包含实际实现的类上,我实现了所有三个接口,并创建了一组静态工厂方法,只创建类的实例并将其转换为适当的接口。

然后,消费者可以致电SomeClass.CreateAsync()SomeClass.CreateSync()SomeClass.CreateFSharp()以获取适合其环境的界面。他们不必明确打开三个子命名空间中的任何一个。

我想我也可以用扩展方法完成它,至少我只想要两个实现。 F#可以定义F#样式和C#样式的扩展方法,但C#使用者将忽略F#扩展,而F#使用者将忽略C#样式扩展。

答案 3 :(得分:0)

我认为这样可行:

你到处都是

let ...

替换为

let inline ...

然后无法从C#调用函数,因为C#编译器不能使用F#内联函数