什么';s“的OCaml命名约定”;建造商;?
OCaml模块通常至少包含一个抽象类型,其惯用名称为什么';s“的OCaml命名约定”;建造商;?,ocaml,naming-conventions,conventions,Ocaml,Naming Conventions,Conventions,OCaml模块通常至少包含一个抽象类型,其惯用名称为t。另外,通常有一个函数构造该类型的值 这个的常用/惯用名称是什么 StdLib在这里并不一致。例如: 有Array.make和一个不推荐使用的函数Array.create。因此该函数应命名为make 另一方面,还有Buffer.create而不是Buffer.make。因此该函数应命名为create 很久以前,当我学习这门语言时,我也遇到了同样的问题。我从不使用make,我想很少有人会这样做 现在,我使用create来表示繁重的、通常是命令
t
。另外,通常有一个函数构造该类型的值
这个的常用/惯用名称是什么
StdLib在这里并不一致。例如:
- 有
和一个不推荐使用的函数Array.make
。因此该函数应命名为Array.create
make
- 另一方面,还有
而不是Buffer.create
。因此该函数应命名为Buffer.make
create
make
,我想很少有人会这样做
现在,我使用create
来表示繁重的、通常是命令式的或有状态的值,例如a。我在基于DSL/combinator的设置中使用v
作为功能性较轻的值,例如Gg中的各种构造函数,例如,或
正如camlspotter在回答中提到的,标准库区分了需要初始值来填充的值的
make
和create
。我认为最好在这里保持常规,并且始终使用create
。如果您的值支持可选的初始填充值,请在create
中添加可选参数,而不是将API入口点相乘。有些人发现这种模块设计方式使OCaml编程更容易,但这不是一种强制性的OCaml编程风格,我不认为它没有正式名称。我个人称之为“1-data-type-per-1-module”风格。(我写了,但它是日语的。我希望一些自动翻译给你一些有用的信息…)
定义一个专用于一种数据类型的模块并修复类型的名称t
有一些值:
很好的名称空间
模块名称解释了它的类型和值,因此您不需要在以下内容中重复类型名称:Buffer.add_string
而不是add_string\u to_Buffer
,以及Buffer.create
而不是create_Buffer
。您还可以避免在本地模块打开时键入相同的模块名称:
let f () =
let open Buffer in
let b = create 10 in (* instead of Buffer.create *)
add_string b "hello"; (* instead of Buffer.add_string *)
contents b (* instead of Buffer.contents *)
简易ML函子应用
如果一个ML函子接受一个具有数据类型的参数模块,我们有一个约定,即该类型应被称为t
。数据类型为t
的模块可以轻松应用于这些函子,而无需重命名类型
对于
Array.create
和Array.make
,我认为这是遵循String.create
和String.make
的区别
是使用未初始化的内容创建字符串。创建的字符串包含随机字节String.create
是用给定的String.make
创建一个字符串char
Array.create
很长一段时间,用来创建一个数组,其内容用给定的值填充。此行为对应于String.make
而不是String.create
。这就是为什么它现在被重命名为Array.make
,而Array.create
已经过时
我们不能在OCaml中使用与String.create
相同的行为创建Array.create
。与字符串不同,数组不能在没有初始化的情况下创建,因为随机字节通常可能不代表内容的有效OCaml值,这会导致程序崩溃
接下来,我个人使用
X.create
函数来创建X.t
,它不需要初始值来填充。如果需要填充,我会使用X.make
。我宁愿使用可选参数create
作为填充值,以避免不必要地乘以API入口点。我认为第二部分应该放在第一位,因为这实际上回答了问题。第一部分根本与问题无关(应该讨论/比较不同的风格才能完整)。@DanielBünzli Nice point但问题更多的是关于现有实践,尤其是标准库中存在的实践。我认为camlspotter很好地抓住了这一点。对我来说,问题是“这个常用/惯用的名称”是什么?在这个意义上,当我创建一个库时,我应该采用哪种策略。虽然camlspotter的分析对标准库来说是正确的,但我不会遵循/延续这种设计策略。作为一个母语人士,create
可能意味着从头开始需要更多的努力或生产,但这只是一个很小的内涵差异,它当然不会让我记住其中包括初始化。