我正在尝试在OCaml中实现一个简单的范围函数,我想知道如何为不同的arity调用执行此操作。
for (i = 0; i < DATAPERROW; i++) {
for (int j = 0; j < NUMPLOTS; j++) {
if (j*NUMPLOTS+i < bytes)
printf ("%hd\t", su.shint[j*NUMPLOTS+i]);
}
printf("\n");
}
这显然不适用于最后一个定义胜利。有没有办法定义多个arity函数?
答案 0 :(得分:6)
一般来说,OCaml中不存在功能的重载。对于您的特定用例,可以使用可选参数:
let range ?(start=0) ?(step=1) stop = range_aux ~start ~step ~stop
let a = range 2
let b = range ~start:1 2
let c = range ~start:1 ~step:2 5
其中?(start=0)
表示命名参数start
是可选的,其默认值为0
。
请注意,我使stop
成为位置参数,因为编译器需要至少一个位置参数来知道何时使用可选参数。
另一种可能性是添加一个单位参数作为最后一个参数:
let range ?(start=0) ?(step=1) ~stop () = range_aux ~start ~step ~stop
let a = range ~stop:2 ()
P.S。 range_aux
或start > stop
时,您的(stop - start) mod step ≠ 0
会进入无限递归。