ocaml - "constructors"的 OCaml 命名约定是什么?

标签 ocaml naming-conventions conventions

一个 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.createArray.make,我觉得这是为了遵循String.createString的区别.制作

  • String.create 是创建一个未初始化内容的字符串。创建的字符串包含随机字节。
  • String.make 是创建一个用给定的 char 填充的字符串。

我们有很长时间的 Array.create 来创建一个数组,其内容由给定的值填充。此行为对应于 String.make 而不是 String.create。这就是为什么它现在重命名为 Array.make,而 Array.create 已过时。

我们不能在 OCaml 中使用 Array.createString.create 相同的行为。与字符串不同,数组不能在没有初始化的情况下创建,因为随机字节通常可能不代表内容的有效 OCaml 值,这会导致程序崩溃。

在此之后,我个人使用 X.create 作为函数来创建一个不需要初始值来填充它的 X.t。如果需要填充内容,我会使用 X.make

关于ocaml - "constructors"的 OCaml 命名约定是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29363460/

相关文章:

module - 扩展 OCaml 模块

model-view-controller - Symfony2和 View 模型的MVC概念

algorithm - 在 Twitter 中显示特定主题的推文

c# - 单元测试顺序约定?

.NET 测试命名约定

ruby-on-rails - 支持复杂嵌套形式的框架 ala Rails 的 accepts_nested_attributes_for?

ocaml - ocaml 中的 {X with value}

functional-programming - 在 OCaml 中构建二叉搜索树的正确方法

html - 一个以上的 html5 数据标签的正确命名约定是什么?

c++ - 合并函数参数的适当命名约定是什么?