OCaml 中递归函数的问题
Problems with recursive function in 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 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])
你也有一些模式匹配的问题,这不是无可辩驳的,但不在问题范围内。
我正在 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])
你也有一些模式匹配的问题,这不是无可辩驳的,但不在问题范围内。