F# 命名规范

20

是否有F#的“官方”命名/大小写规范?

我一直在犹豫是否要使用C#风格:

Class.MyFunctionName or Module.my_function_name
在F#中,你应该混合使用BCL类和F#库类:它们有不同的大小写方式,代码看起来很丑。
6个回答

26

是的,存在混淆,因为F#经过多年从OCaml到.Net的演变。基本上,命名约定是一种“破坏性变更”-旧代码与新代码不一致。

然而,2009年5月的CTP已经解决了这个问题。

发行说明中说...

标准库命名约定

采用的F#库命名约定如下:

  • 所有.NET和F# OO代码都按照现有的.NET指南使用PascalCase

  • F#函数式编程操作符(例如List.map)仅供F#内部实现代码使用。这种代码使用camelCase作为操作符名称

  • 不应使用下划线。

所以,你的问题是...

Class.MyFunctionName or Module.my_function_name 
答案是:

答案为:

Class.MyFunctionName 和 Module.MyFunctionName(但请参见下面的编辑!)

(应用规则1以上)。

-- 编辑。2019年11月2日 --

当前指南建议在模块级别使用 camelCase 作为函数命名方式,因此是

Module.myFunctionName

这样可以使生产代码与 F# 库保持一致(例如 List.averageBy)。


1
更新 - 在最新版本中,to_type函数已被弃用,改用toType函数。 - Benjol
谢谢。为了简单起见,我删除了提到它们的文本。 - Stephen Hosking
1
这不再符合当前的指南。模块绑定的公共函数应该使用驼峰命名法。https://learn.microsoft.com/en-us/dotnet/fsharp/style-guide/formatting#use-camelcase-for-module-bound-public-functions - chtenb
1
@ChieltenBrinke。感谢您提供的信息 - 我已经更新了答案。很高兴看到这个 - 我一直都在使用这种约定。 - Stephen Hosking

7
我认为当前被接受答案的时间已经过去,答案可能已经发生了变化。
今天的F#风格指南如下所述:

Use PascalCase for type declarations, members, and labels

Classes, interfaces, structs, enumerations, delegates, records, and discriminated unions should all be named with PascalCase. Members within types and labels for records and discriminated unions should also use PascalCase.

type IMyInterface =
    abstract Something: int

type MyClass() =
    member this.MyMethod(x, y) = x + y

type MyRecord = { IntVal: int; StringVal: string }

type SchoolPerson =
    | Professor
    | Student
    | Advisor
    | Administrator

https://learn.microsoft.com/en-us/dotnet/fsharp/style-guide/formatting#use-pascalcase-for-type-declarations-members-and-labels

并且

Use camelCase for module-bound public functions

When a module-bound function is part of a public API, it should use camelCase: F#

module MyAPI =
    let publicFunctionOne param1 param2 param2 = ...

    let publicFunctionTwo param1 param2 param3 = ...

https://learn.microsoft.com/en-us/dotnet/fsharp/style-guide/formatting#use-camelcase-for-module-bound-public-functions

所以,基于这些,我的答案是:

Class.MyFunctionName 
Module.my_function_name 

应该写成这样:
Class.MyFunctionName  
Module.myFunctionName 

3

任何官方声明:我认为“还没有完全准备好”,但是在VS 2010达到Beta1时,您可能会看到F#库以接近最终的形式出现,并且与CTP相比会有很多重命名。考虑到其历史,F#可能始终比其较老的.NET兄弟们更加不稳定。


嗨,布莱恩,你说的“鉴于其历史,F#可能永远比其较老的.NET表兄弟们更为分裂”是什么意思?谢谢。 - Joan Venge
2
历史:F# 源于 OCaml,仍然保留了与 OCaml 很大程度上源代码兼容的核心。但是OCaml 有不同的命名约定与 .Net 不同,所以 F# 被拉向两个不同的方向。 - Brian

2
我理解和目前的用法是,模块/静态函数使用小写字母,而“实例”函数使用大写字母。 编辑:这不是对这个问题的回答,但相关:Don Syme的F#格式约定

1

从我在hubfs.com和其他来源所看到的,它是由.NET和OCaml混合而成的。

我希望他们能够选择一种方式并坚持下去,而不是有两种不同的约定。作为微软,我相信他们会采用.NET风格。


0

不确定是否有真正的解决方案。似乎OCaml风格的代码可能会保留一些命名,即小写模块方法,而OO成员将采用.NET风格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接