尝试使用 for 循环在 OCaml 中调用函数 i-times
Trying to call function i-times in OCaml with a for cycle
我一直在尝试创建一个循环来调用 changing
函数 i
次,但由于某种原因,循环本身总是会报错。我也尝试过一个递归函数来调用它自己,但也没有用。
是否有可能让它与 for`s 一起工作。
r
是列表的列表。
a
和b
是两个不可变变量。
(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;;
我一直在尝试创建一个循环来调用 changing
函数 i
次,但由于某种原因,循环本身总是会报错。我也尝试过一个递归函数来调用它自己,但也没有用。
是否有可能让它与 for`s 一起工作。
r
是列表的列表。
a
和b
是两个不可变变量。
(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;;