基于The F# Component Design Guidelines,F#应使用PascalCase
来符合.NET Framework命名约定。
假设我使用C#或VB.NET并想要导入一个F#库,我应该何时在此库中出现camelCase
约定?
答案 0 :(得分:5)
查看FsCheck library,特别是Gen module。 (FsCheck源代码中还有其他示例,但这个易于阅读)。 FsCheck设计用于F#和C#,Gen模块的设计反映了:
module Gen =
// ...
[<CompiledName("Map"); EditorBrowsable(EditorBrowsableState.Never)>]
let map f (gen:Gen<_>) = gen.Map f
[<CompiledName("Sized"); EditorBrowsable(EditorBrowsableState.Never)>]
let sized fgen = Gen (fun n r -> let (Gen m) = fgen n in m n r)
[<CompiledName("Sized"); CompilerMessage("This method is not intended for use from F#.", 10001, IsHidden=true, IsError=false)>]
let sizedFunc (sizedGen : Func<int,Gen<_>>) =
sized sizedGen.Invoke
暂时忽略这些函数的实现,并查看它们的名称以及每个函数的CompiledName
属性。当您从F#调用map
函数时,您将调用Gen.map
,但是当您从C#中使用它时,CompiledName
属性将使您看到它名称Gen.Map
。与sized
函数类似,从F#代码调用时将调用Gen.sized
,从C#调用时将看到名称为Gen.Sized
的函数。还要注意第二个函数如何具有相同的CompiledName
(从C#中看到),但F#代码区分Gen.sized
和Gen.sizedFunc
(并且F#编译器将如果您尝试使用Gen.sizedFunc
并且#34;此方法不打算在F#&#34;)中使用,也会发出警告,因为该重载需要C#代码使用的函数类型,纯粹是为了方便使用该库的C#编码员。 (F#函数使用FSharpFunc
类型,在某些情况下,其行为与C#Func
类型不同。)
但是,你的问题不是那么多&#34;我应该如何编写我的F#库以便C#编码器可以使用它?&#34;。相反,你的问题是,&#34;作为一名C#编码员,在命名约定方面我应该从F#库中得到什么?&#34; 问题的答案是:这取决于您正在使用的库。
正如您所指出的,F#组件设计指南推荐PascalCase名称,用于设计用于调用代码的函数。而且FsCheck是一个很好的例子,它正确地完成了它。但并非所有的库都是为了从C#中轻松使用而编写的。有些库只是考虑使用它们的其他F#代码,而那些库不必然符合设计指南,因为F#约定是使用camelCase作为函数名。
所以虽然这不是一个完全令人满意的答案,但它是我能给你的最好的答案,因为我不知道你将使用哪些图书馆。