在导出到其他.NET语言时,我何时会在F#中使用camelCase?

时间:2017-04-03 04:30:48

标签: c# .net vb.net f# naming-conventions

基于The F# Component Design Guidelines,F#应使用PascalCase来符合.NET Framework命名约定。

假设我使用C#或VB.NET并想要导入一个F#库,我应该何时在此库中出现camelCase约定?

1 个答案:

答案 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.sizedGen.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作为函数名。

所以虽然这不是一个完全令人满意的答案,但它是我能给你的最好的答案,因为我不知道你将使用哪些图书馆。