Ocaml中函数的命名约定

时间:2011-11-27 15:44:55

标签: naming-conventions ocaml

由于Ocaml不接受函数重载,有时我必须为不同类型定义一些类似的函数。例如,

let reduce_a (a: A): A = ...
let reduce_b (b: B): B = ...

let a_compare (a0: A) (a1: A): bool = ...
let b_compare (b0: B) (b1: B): bool = ...

我知道最好的方法是拥有两个模块AB,并创建两个函数A.reduceB.reduce。但在创建模块之前,我只想知道命名函数的最佳约定。

人们通常喜欢命名reduce_a(类型前的动词)或a_reduce(动词前的类型)吗?我们能在标准库中找到一些例子吗?

2 个答案:

答案 0 :(得分:6)

另一种选择是将它们放在自己的模块中,比如

module A = struct

    type t = ...
    let reduce x = ...
    let compare x y = ...

end

module B = struct ... (* you get the point *) end

通过这种方式,您无需担心函数是compare_a还是a_compare,因为它必须是A.compare。你必须克制自己(除了当地之外)打开模块。当然,此解决方案的工作能力取决于您正在处理的类型。

答案 1 :(得分:1)

我发现a_compare格式比compare_a使用得多,包括OCaml编译器本身,所以你不妨使用那个约定。没有任何实际的好处,除了化妆品对齐,以及它“感觉”像命名空间的事实。

请注意,对于记录类型中的标签和变体类型中的构造函数,它通常用于函数。