Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解OCaml中的基本递归_Ocaml - Fatal编程技术网

理解OCaml中的基本递归

理解OCaml中的基本递归,ocaml,Ocaml,大家好,我正在尝试制作一个简单的递归方法,它只需要一个累加器和一个目标值。然后向累加器中添加一个,直到达到目标值。我对Ocaml非常陌生,但对java有着良好的背景 我写了一段代码,展示了我想在java中做什么: public static int rec(int acc,int target) { if (acc == target) { return 0; } else { return rec(acc+

大家好,我正在尝试制作一个简单的递归方法,它只需要一个累加器和一个目标值。然后向累加器中添加一个,直到达到目标值。我对Ocaml非常陌生,但对java有着良好的背景

我写了一段代码,展示了我想在java中做什么:

    public static int rec(int acc,int target) {
        if (acc == target) {
            return 0;
        } else {
            return rec(acc+1, target);
        }
    }
下面是我在Ocaml中模拟此代码的尝试:

  let h_sequence x =
      let rec helper acc x = function
      | acc -> x
      | _ -> helper acc+1 x
      in
      helper 0 x;;
但是,我得到以下错误:

Error: This expression has type 'a -> 'b -> 'a
       but an expression was expected of type int
下面是我如何理解Ocaml代码的。我们有一个函数h_序列,它有一个参数x。在函数h_序列内部,我们有一个名为helper的递归函数,它有两个参数acc和x。如果acc=x,则返回x。否则,通过传入helper来启动递归,将一个添加到acc,然后返回x。输入后,它将传递helper函数,将acc设置为0,并将x设置为x。如果我的逻辑不正确,请告诉我。任何帮助都将不胜感激

编辑新代码:

  let h_sequence x =
      let rec helper acc x = 
        if acc = x then
            acc
        else
            helper (acc+1) x
      in
      helper 0 x;;


正如@Flux所说,您的helper函数有3个参数。您还应注意,模式
acc
将匹配所有值。模式基本上由常量组成,模式中出现的任何名称都将匹配(并绑定)任何相应的值

要将
x
acc
进行比较,只需使用if语句即可

由于您并不真正想使用模式匹配,因此可以通过删除
函数
来简化操作。对于helper函数,您将得到如下结果:

let rec helper acc x =
    if x = acc then (* One of the cases *)
    else (* The other case *)
let rec helper acc x = function
    | zzz -> x  (* Equivalent to `| _ -> x` *)
    | _ -> helper acc+1 x

正如@Flux所说,您的helper函数有3个参数。您还应注意,模式
acc
将匹配所有值。模式基本上由常量组成,模式中出现的任何名称都将匹配(并绑定)任何相应的值

要将
x
acc
进行比较,只需使用if语句即可

由于您并不真正想使用模式匹配,因此可以通过删除
函数
来简化操作。对于helper函数,您将得到如下结果:

let rec helper acc x =
    if x = acc then (* One of the cases *)
    else (* The other case *)
let rec helper acc x = function
    | zzz -> x  (* Equivalent to `| _ -> x` *)
    | _ -> helper acc+1 x
。。。我们有一个名为helper的递归函数,它有两个参数acc和x

之所以出现此错误,是因为递归函数
helper
实际上有三个“参数”:
acc
x
,以及另一个使用
函数匹配的“参数”。错误消息为您提供了此线索(
'a->'b->'a

现在让我们看一下
helper
函数:

let rec helper acc x =
    if x = acc then (* One of the cases *)
    else (* The other case *)
let rec helper acc x = function
    | zzz -> x  (* Equivalent to `| _ -> x` *)
    | _ -> helper acc+1 x
错误:

  • 功能
    进行模式匹配。所有内容都将匹配模式
    zzz
    ,这意味着下一个模式(
    |uz->helper acc+1 x
    )是无用的,因为它永远不会匹配。请注意,我已将模式的名称从您的
    acc
    更改为
    zzz
    ,以强调
    功能实际上与模式匹配

  • helper acc+1 x
    相当于
    (helper acc)+1 x
    ,这不是您想要的。它应该是
    helper(acc+1)x

  • 解决方案 您应该使用
    =
    而不是
    =
    来处理
    x
    为负值的情况

    。。。我们有一个名为helper的递归函数,它有两个参数acc和x

    之所以出现此错误,是因为递归函数
    helper
    实际上有三个“参数”:
    acc
    x
    ,以及另一个使用
    函数匹配的“参数”。错误消息为您提供了此线索(
    'a->'b->'a

    现在让我们看一下
    helper
    函数:

    let rec helper acc x =
        if x = acc then (* One of the cases *)
        else (* The other case *)
    
    let rec helper acc x = function
        | zzz -> x  (* Equivalent to `| _ -> x` *)
        | _ -> helper acc+1 x
    
    错误:

  • 功能
    进行模式匹配。所有内容都将匹配模式
    zzz
    ,这意味着下一个模式(
    |uz->helper acc+1 x
    )是无用的,因为它永远不会匹配。请注意,我已将模式的名称从您的
    acc
    更改为
    zzz
    ,以强调
    功能实际上与模式匹配

  • helper acc+1 x
    相当于
    (helper acc)+1 x
    ,这不是您想要的。它应该是
    helper(acc+1)x

  • 解决方案
    您应该使用
    =
    而不是
    =
    来处理
    x
    为负的情况。

    递归函数
    helper
    实际上有三个“参数”:
    acc
    x
    ,以及另一个“参数”递归函数
    helper
    实际上有三个“参数”:
    acc
    x
    ,以及另一个使用
    函数
    匹配的“参数”。