由于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 = ...
我知道最好的方法是拥有两个模块A
和B
,并创建两个函数A.reduce
和B.reduce
。但在创建模块之前,我只想知道命名函数的最佳约定。
人们通常喜欢命名reduce_a
(类型前的动词)或a_reduce
(动词前的类型)吗?我们能在标准库中找到一些例子吗?
答案 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编译器本身,所以你不妨使用那个约定。没有任何实际的好处,除了化妆品对齐,以及它“感觉”像命名空间的事实。
请注意,对于记录类型中的标签和变体类型中的构造函数,它通常用于函数。