在OCaml中定义多个arity函数的正确方法是什么?

时间:2017-10-22 09:50:42

标签: ocaml

我正在尝试在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函数?

1 个答案:

答案 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_auxstart > stop时,您的(stop - start) mod step ≠ 0会进入无限递归。