Function OCaml中递归函数的问题

Function OCaml中递归函数的问题,function,recursion,integer,ocaml,Function,Recursion,Integer,Ocaml,我正在用OCaml做一个函数,我想计算变量n中的迭代次数。这就是功能: let mapdoble f1 f2 l = let rec aux n f_1 f_2 l1 l2= match(n,f_1,f_2,l1,l2) with (n,_,_,[],l2) -> l2 | (n,f_1,_,h::t,l2) when n mod 2 = 0 -> aux n+1 f1 f2 t l2@[f_1 h] | (n,_,f_2,h::t,l2) when n m

我正在用OCaml做一个函数,我想计算变量n中的迭代次数。这就是功能:

let mapdoble f1 f2 l = 
let rec aux n f_1 f_2 l1 l2= match(n,f_1,f_2,l1,l2) with
    (n,_,_,[],l2) -> l2
    | (n,f_1,_,h::t,l2) when n mod 2 = 0 -> aux n+1 f1 f2 t l2@[f_1 h]
    | (n,_,f_2,h::t,l2) when n mod 2 = 1 -> aux n+1 f1 f2 t l2@[f_2 h]
in
    aux 0 f1 f2 l [];;
当我编译它时,我有一个错误,我不知道它是什么:

Error: This expression has type 'a -> 'b -> 'c list -> 'd -> 'd but an expression was expected of type int

函数应用程序是函数名及其参数并置编写的,它的绑定比中缀运算符更紧密,即它具有更高的优先级。为了澄清上述内容,让我们来看一个例子。表达方式:

aux n+1 f1 f2 t l2@[f_1 h]
编译器实际将其解析为:

(aux n) + (1 f1 f2 t l2) @ ([f_1 h])
现在,我希望,这是显而易见的,为什么你得到这么奇怪的编译器消息。特别是,您正在尝试将
(+)
运算符应用于
aux n
的结果,它实际上是四个参数的函数,绝对不是int

因此,正确的版本应该是:

aux (n + 1) f1 f2 t (l2 @ [f_1 h])

模式匹配也有一些问题,这不是无可辩驳的,但超出了问题的范围

我认为您只是缺少了
n+1
@ReimerBehrends is write的两个实例周围的括号,您必须在
n+1
周围加上括号。您还必须匹配所有情况,编译器也应该通过示例警告您这一点。