尝试使用 for 循环在 OCaml 中调用函数 i-times

Trying to call function i-times in OCaml with a for cycle

我一直在尝试创建一个循环来调用 changing 函数 i 次,但由于某种原因,循环本身总是会报错。我也尝试过一个递归函数来调用它自己,但也没有用。

是否有可能让它与 for`s ​​一起工作。

r 是列表的列表。

ab是两个不可变变量。

(List.nth (r) (i))给出一个列表。

let rec changing (lista: 'a zlista) (a:int) (b:int) = 
  match lista with    
  | Vazio          -> failwith "NO"
  | Nodo (n, l, r) -> 
    if a <= n && n <= b then n
    else if a < n && b < n then changing l a b 
    else  changing r a b


let rec call_changing (a: int) (b: int) =
  for i=0 to ort do
    changing (List.nth (r) (i)) (a) (b)
  done;;

更改 returns 一个 int,为了在 for 循环中调用它,您必须 ignore 函数的结果 :

for i = 0 to ort do
   let _ = changing .... in ()
done

(* Or *)

for i = 0 to ort do
   ignore (changing ....)
done

编辑:

如果你想打印结果,你可以这样做:

for i = 0 to ort do
   Printf.printf "Result for %d iteration : %d\n" i (changing ....)
done

有关详细信息,请参阅 the Printf documentation

为了概括 Butanium 的回答,OCaml 不是一种纯函数式编程语言。它确实包含命令式功能。命令式功能都是关于 side-effects。按照惯例 return ()unit 类型的字面量)。side-effects =20=]

for 循环是一个必要的特性。因此,它期望包含在其中的任何表达式(或 expessions; 链接)将 return unit。如果他们不这样做,您将收到警告。

for 循环表达式本身 (for ... = ... to ... do ... done) returns unit 因此警告可以提示您循环中没有 side-effects 的任何代码是无关紧要的,虽然您的代码将编译并运行,但它可能不会达到您的预期。

附带说明一下,我相信您可能对括号有点过分热心,这可能会使您的代码更难阅读。

let rec call_changing (a: int) (b: int) =
for i=0 to ort do
changing (List.nth (r) (i)) (a) (b)
done;;

正确缩进并删除无关的括号:

let rec call_changing (a: int) (b: int) =
  for i=0 to ort do
    changing (List.nth r i) a b
  done;;