【问题标题】:Counter Variable in Ocaml?Ocaml中的计数器变量?
【发布时间】:2019-03-07 23:34:43
【问题描述】:

如果您不能在 Ocaml 中使用可变状态,您将如何在递归函数中创建计数器变量。例如:

假设你有一个数据类型,你想以递归方式匹配(该数据类型的)表达式。

Match expression (e: example) : int
|O(i) -> int x + 1

因此,在该示例中(其他情况故意省略),如果您发现 O(i),您希望 int x 从 0 增加,+ 1 + 2 + 3...

当我尝试实现它时,它会显示“unbound value int”。那么你将如何创建一个可以随着每次迭代而改变的变量。

对不起,如果这没有意义。

【问题讨论】:

  • 为当前状态的递归函数添加另一个参数,并为每个递归调用使用新的(递增的)值调用它。将计数器的起始值传递给初始调用。

标签: recursion functional-programming ocaml


【解决方案1】:

从命令式看待事物的方式切换到函数式看待事物的一种方法是想象你想要更改的每个变量都是函数的参数。当你想改变变量的值时,你调用传递新值的函数。

这听起来可能很疯狂(或者可能不是),但这实际上是 FP 中的工作方式。

下面是一些命令式代码,用于计算数字 5 在整数列表中出现的次数:

 let how_many_5s l =
     let rest = ref l in
     let count = ref 0 in
     while !rest <> [] do
          if List.hd !rest = 5 then
              count := !count + 1;
          rest := List.tl !rest
     done;
     !count

这是执行相同操作的功能代码。上面代码中修改的变量,剩下的列表和计数器,都是内部函数的参数。

 let how_many_5s_functional list =
     let rec inner count list =
         match list with
         | [] -> count
         | 5 :: t -> inner (count + 1) t
         | _ :: t -> inner count t
     in
     inner 0 list

【讨论】:

  • 匹配函数的最后一个参数可以使用function [] -&gt; ...代替。
【解决方案2】:

我不完全确定你在问什么,以及你正在使用什么语法(它不是 OCaml),但既然你提到了“递归”和“计数器变量”,我将尝试说明一下如何使用此示例在递归期间增加计数器,该示例构造了一个列表,其中包含从 ab 的数字:

let rec range a b =
    if a > b then
        []
    else
        a :: range (a + 1) b

对于每次迭代,a 的值将增加 1,直到达到b,并且通过将a 添加到通过递归运行range 生成的列表的头部来构造列表,并增加@ 987654328@.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    相关资源
    最近更新 更多