是否可以使模块或类型仅对F#项目可见?其他语言看不到活动模式,但我认为这是因为它们不是这些语言中的有效标识符。是否有其他方法可以实现模块/类型的相同效果?
答案 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#内联函数