【问题标题】:Problems with recursive function in OCamlOCaml中递归函数的问题
【发布时间】:2016-01-22 22:30:11
【问题描述】:

我正在 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

【问题讨论】:

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

标签: function recursion integer ocaml


【解决方案1】:

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

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])

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

【讨论】:

    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 2012-04-30
    • 2013-05-20
    • 1970-01-01
    • 2015-12-08
    • 2011-10-16
    • 2015-01-27
    • 1970-01-01
    相关资源
    最近更新 更多