Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';s“的OCaml命名约定”;建造商;?_Ocaml_Naming Conventions_Conventions - Fatal编程技术网

什么';s“的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来表示繁重的、通常是命令

OCaml模块通常至少包含一个抽象类型,其惯用名称为
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
可能意味着从头开始需要更多的努力或生产,但这只是一个很小的内涵差异,它当然不会让我记住其中包括初始化。