一个 OCaml 模块通常包含至少一个抽象类型,其惯用名称是 t
。此外,通常有一个函数可以构造该类型的值。
这个的常用/惯用名称是什么?
StdLib 在这里不一致。例如:
- 有
Array.make
和一个已弃用的函数Array.create
。那么该函数应该命名为make
吗? - 另一方面,有
Buffer.create
但没有Buffer.make
。那么该函数应该命名为create
吗?
最佳答案
有些人发现这种模块设计方式使 OCaml 编程更容易,但这不是强制性的 OCaml 编程风格,我认为它没有正式名称。我个人称其为“1-data-type-per-1-module”风格。 (我写了a blog post about this,但它是日文的。我希望一些自动翻译器能给你一些有用的信息......)
定义一个专用于一种数据类型的模块并固定类型的名称 t
有一些值:
漂亮的命名空间
模块名称解释了它的类型和值是什么,因此您不需要在内部重复类型名称:Buffer.add_string
而不是 add_string_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的区别.制作
。
String.create
是创建一个未初始化内容的字符串。创建的字符串包含随机字节。String.make
是创建一个用给定的char
填充的字符串。
我们有很长时间的 Array.create
来创建一个数组,其内容由给定的值填充。此行为对应于 String.make
而不是 String.create
。这就是为什么它现在重命名为 Array.make
,而 Array.create
已过时。
我们不能在 OCaml 中使用 Array.create
与 String.create
相同的行为。与字符串不同,数组不能在没有初始化的情况下创建,因为随机字节通常可能不代表内容的有效 OCaml 值,这会导致程序崩溃。
在此之后,我个人使用 X.create
作为函数来创建一个不需要初始值来填充它的 X.t
。如果需要填充内容,我会使用 X.make
。
关于ocaml - "constructors"的 OCaml 命名约定是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29363460/